声明为 class 字段而不是全局变量
Declaring as a class field instead of global variable
看看这个非常基本的 C++ 代码:
class Class1 {
};
Class1 c1;
class Class2
{
public:
Class2(Class1 &c)
{
}
};
// Class2 abcd(c1); // OK outside declaration
class Class3
{
public:
Class2 abcd(c1); // Declaration of abcd as field -> error: unknown type name 'c1'
};
关于 abcd
声明,我有一些不明白的地方:如果我将它声明为全局变量,它就可以工作。但是如果我将它声明为 Class3
.
中的字段,我会遇到编译器错误
非静态数据成员的default member initializer (C++11 起)只能与大括号或等号初始化器一起使用,但不能与圆括号初始化器一起使用。
Through a default member initializer, which is simply a brace or equals initializer included in the member declaration, which is used if the member is omitted in the member initializer list
If a member has a default member initializer and also appears in the member initialization list in a constructor, the default member initializer is ignored.
所以你可以
class Class3
{
public:
Class2 abcd{c1}; // brace initializer
Class2 abcd = Class2(c1); // equals initializer
};
看看这个非常基本的 C++ 代码:
class Class1 {
};
Class1 c1;
class Class2
{
public:
Class2(Class1 &c)
{
}
};
// Class2 abcd(c1); // OK outside declaration
class Class3
{
public:
Class2 abcd(c1); // Declaration of abcd as field -> error: unknown type name 'c1'
};
关于 abcd
声明,我有一些不明白的地方:如果我将它声明为全局变量,它就可以工作。但是如果我将它声明为 Class3
.
非静态数据成员的default member initializer (C++11 起)只能与大括号或等号初始化器一起使用,但不能与圆括号初始化器一起使用。
Through a default member initializer, which is simply a brace or equals initializer included in the member declaration, which is used if the member is omitted in the member initializer list
If a member has a default member initializer and also appears in the member initialization list in a constructor, the default member initializer is ignored.
所以你可以
class Class3
{
public:
Class2 abcd{c1}; // brace initializer
Class2 abcd = Class2(c1); // equals initializer
};