假设我有一个没有默认构造函数的类A,一个返回类型A的对象的工厂方法factoryA,以及一个以A作为其成员的类B. 我知道在这种情况下,B类型A的成员必须在B的构造函数初始化列表中初始化.我并不完全清楚为什么如果有人可以向我解释这将是伟大的.另外,如果A的构造函数的参数需要在B的构造函数内部计算,比如通过查询数据库或那种性质的东西,该怎么办?有没有办法使用下面的设置,而不提供A与默认构造函数?提前致谢.
class A {
private:
int _i;
public:
A(int i) : _i(i) {}
};
A factoryA(bool b) {
if(b)
return A(1);
else return A(2);
}
class B {
private:
A _a;
public:
B(int j) {
if(j > 0)
_a = factoryA(true);
else _a = factoryA(false);
}
};
Run Code Online (Sandbox Code Playgroud) 我需要关于“这个”主题的可靠信息:
class MyClass, public QWidget
{
public:
MyClass( QWidget * parent = NULL )
:QWidget( parent ),
mpAnotherWidget( new QWidget( this ) ){};
private:
QWidget * mpAnotherWidget;
};
Run Code Online (Sandbox Code Playgroud)
当然,在构造函数或初始化列表中调用虚函数是一个坏主意。问题是:这个代码可以吗
mpAnotherWidget( new QWidget( this ) )
Run Code Online (Sandbox Code Playgroud)
导致未定义的行为?!如果是这样:为什么?
如果可以,请引用您的来源!谢谢!
变量有什么问题international_standard_book_number
?我怎样才能让它改变,无论何时isbn_field_i
改变?
#include <iostream>
#include <string>
class ISBN
{
private:
unsigned int isbn_field_1 = 0;
unsigned int isbn_field_2 = 0;
unsigned int isbn_field_3 = 0;
char digit_or_letter = 'a';
std::string international_standard_book_number =
std::to_string(isbn_field_1) + "-" + std::to_string(isbn_field_2) + "-" +
std::to_string(isbn_field_3) + "-" + digit_or_letter;
public:
ISBN()
{
isbn_field_1 = 0, isbn_field_2 = 0, isbn_field_3 = 0, digit_or_letter = 'a';
}
ISBN(unsigned int a, unsigned int b, unsigned int c, char d)
{
isbn_field_1 = a, isbn_field_2 …
Run Code Online (Sandbox Code Playgroud) 我正在二次表达式,其中y=ax^2 + bx + c
与a
,b
,c
是常数,x
是一个变量.这是我的班级:
class quadratic {
public:
double evaluate(const double x);
void getCoefficients (double &A, double &B, double &C);
void setCoefficients (const double A, const double B, const double C);
private:
double a;
double b;
double c;
};
Run Code Online (Sandbox Code Playgroud)
我将为该类创建两个构造函数,以便以下是合法的
quadratic y1 = quadratic(1.0, -5.0, 7.0);
quadratic y2 = quadratic(-3.0, -2.0, 10.0);
quadratic y3;
Run Code Online (Sandbox Code Playgroud)
默认构造函数应设置为零,而第二个构造函数中的参数指示系数的初始值.
以下是我认为我应该这样做的方式:
quadratic() //default values
{
double A, double B, double C = 0.0;
} …
Run Code Online (Sandbox Code Playgroud) 我听说在构造函数中使用初始化列表的优点是不会有类型对象的额外副本.但是对于T类构造函数中的以下代码,它意味着什么?如果我评论分配并使用初始化列表会有什么区别?
#include <iostream>
using std::cout;
using std::endl;
using std::ostream;
class X {
public:
X(float f_x = 0, float f_y = 0):x(f_x), y(f_y) {}
~X() {}
X(const X& obj):x(obj.x), y(obj.y) {}
friend ostream& operator << (ostream &os, X &obj);
private:
float x;
float y;
};
ostream& operator << (ostream &os, X &obj)
{ os << "x = " << obj.x << " y = " << obj.y; return os;}
class T {
public:
T(X &obj) : x(obj) { /* x = …
Run Code Online (Sandbox Code Playgroud) 可以像这样使用初始化吗?
class Foo
{
public:
Foo() : str("str") {}
char str[4];
};
Run Code Online (Sandbox Code Playgroud)
还有这个?
int main()
{
char str[4]("str");
}
Run Code Online (Sandbox Code Playgroud)
两者都给我gcc 4.7.2中的错误:
error:用作初始化程序的数组
Comeau编译两者.
如果所有类/结构数据成员都缺少初始化程序,则可以使用统一初始化语法来构造对象.
struct foo
{
int i;
float f;
};
...
foo bar{ 5, 3.141f };
Run Code Online (Sandbox Code Playgroud)
但是如果一个或多个成员具有初始化器,则统一初始化语法将变为无效.
struct foo
{
int i;
float f = 0;
};
...
foo bar{ 5, 3.141f }; // Compiler error.
Run Code Online (Sandbox Code Playgroud)
我猜测添加数据成员初始值设定项会自动实现一个或多个默认构造函数,并禁止构造函数的默认实现initialization_list
.这是预期的标准吗?为什么这样工作?
以下是明确界定的吗?
class A;
class B;
// define A, which takes B& in constructor
// define B, which takes A& in constructor
class C
{
A a;
B b;
public:
C() : a(b), b(a) { /* stuff with a and b */ }
}
Run Code Online (Sandbox Code Playgroud)
在ideone.com上的完整示例.
是否安全/定义良好,只要构造函数对于它们所获得的引用A
并且B
不做任何操作?
c++ constructor initialization circular-dependency initialization-list
我很好奇以下代码是否有效。静态分析在此构造函数上给出错误。
总结:成员变量'A'是自己初始化的。
总结:成员变量'B'是自己初始化的。
总结:成员变量'C'是自己初始化的。
class Foo
{
public:
Foo(int A, int B, int C);
private:
int A;
int B;
int C;
}
Foo::Foo(int A, int B, int C) :
A(A),
B(B),
C(C)
{}
Run Code Online (Sandbox Code Playgroud)
我知道这不是一个好的做法,可能应该改变,但是我想知道静态分析警告是否是误报并且成员变量是否会被正确初始化。
在 C++ 中,以下两种初始化向量的方法之间有什么技术区别?
vector<int> v_1 {0, 1, 2};
vector<int> v_2 = {3, 4, 5};
Run Code Online (Sandbox Code Playgroud)
第一个是初始化列表。第二个是什么?
我很欣赏有关正确术语以及参考文档和不同标准版本(C++98 与 C++11)的提示。
c++ ×10
constructor ×5
arrays ×1
c++11 ×1
c++17 ×1
class ×1
oop ×1
qt ×1
this-pointer ×1
vector ×1