声明为 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
};