C++ 是否初始化作为对象的默认数据成员?

C++ 是否初始化作为对象的默认数据成员?,c++,c++11,object,syntax,C++,C++11,Object,Syntax,为什么必须在构造函数中初始化对象数据成员,而不能像使用基元类型那样默认初始化它们?是否可以像使用基元类型一样初始化它们 下面是一个例子: 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:

为什么必须在构造函数中初始化对象数据成员,而不能像使用基元类型那样默认初始化它们?是否可以像使用基元类型一样初始化它们

下面是一个例子:

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
};

类内初始值设定项仅适用于
运算符=
语法或大括号初始值设定项列表,而不适用于函数样式的初始化。所以

foo x{1};
而不是

foo x(1);
我们应该做到这一点

在您的情况下,您还可以使用

foo x = 1;
但是,如果
foo
的构造函数采用单个
int
显式的

类定义中的允许会导致区分函数声明的困难,那么这种情况就会发生:

考虑:

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;


因为除去文字,这几乎与函数定义相同,并且支持两者将使语言的语法更加复杂。当你有两种更具可读性的方法来实现相同的目标时,为什么要这样做呢?如果你使用标识符而不是文字–
foox(baz)–从一开始就是成员函数的声明。确定它是函数还是变量取决于作用域中的
baz
是类型还是变量是导致精神错乱的路径。
foo f{1};
foo f = {1};