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