为什么必须在构造函数中初始化对象数据成员,并且不能像原始类型那样默认初始化它们?是否可以像原始类型一样初始化它们?
以下是一个例子:
class foo {
int a;
public:
foo(int _a) :a(_a) {};
};
class bar {
string a = "asdf";//no error
int num = 1;//no error
foo x(1); //error, why?
foo z;
public:
bar(): z(1){}//no error
};
答案 0 :(得分:5)
类内初始化程序仅使用operator=
语法或大括号初始化程序列表,而不是函数样式初始化。所以
foo x{1};
而不是
foo x(1);
应该这样做。
在您的情况下,您也可以使用
foo x = 1;
但如果foo
的构造函数只占int
explicit
,则会中断。
答案 1 :(得分:2)
在类定义中允许direct-initialization 会导致难以区分函数声明:
考虑:
struct k;
struct foo { foo(int x = 1){} };
class toto
{
static constexpr int k = 1;
foo x(1); // hm might be ok...
foo y(); // hm ... NOK , what y is ? an object or a function declaration?!?!
foo z(k); // problem .... this seems a fucntion definition?!!!
foo z{k}; // clear it is not a function definition
};
执行此操作的正确方法是:
foo f= 1;
或
foo f{1};
或
foo f = {1};