C++ 我可以初始化头文件中本身是类的数据成员吗?

C++ 我可以初始化头文件中本身是类的数据成员吗?,c++,initialization,C++,Initialization,来自本文“” 它说: 没有其他方法可以将参数传递给m_成员 这意味着我们不能。但我不明白我们不能写: class CMyClass { CMember m_member(2); public: CMyClass(); }; 在本文中: 它有一个构造函数,允许您指定其初始值 CDynamicString(wchat_*pstrInitialString) 要对写入的注册表项名称进行“硬编码”,请使用大括号: class Registry_Entry{ public: Re

来自本文“”

它说: 没有其他方法可以将参数传递给m_成员

这意味着我们不能。但我不明白我们不能写:

class CMyClass {
    CMember m_member(2);
public:
    CMyClass();
};
在本文中:

它有一个构造函数,允许您指定其初始值 CDynamicString(wchat_*pstrInitialString)

要对写入的注册表项名称进行“硬编码”,请使用大括号:

class Registry_Entry{
public:
    Registry_Entry();
    ~Registry_Entry();
    Commit();//Writes data to registry.
    Retrieve();//Reads data from registry;
private:
    CDynamicString m_cKeyName{L"Postal Address"};
    CDynamicString m_cAddress;
};
根据我自己的测试,我们不能使用

CMember m_member(2);
在头文件中。 但是为什么呢

为什么呢

CDynamicString m_cKeyName{L"Postal Address"};

你能工作吗?(顺便说一句,我怀疑有输入错误。它应该删除“L”。

在C++11之前,初始化类的非静态成员的唯一方法是在该类的构造函数中,而不是在类定义中


C++11放宽了一些限制(并引入了初始化器列表,用于初始化CDDynamicString)但不是所有的。也不是所有的编译器都跟上了变化。因此,你会看到一些明显的异常现象。

CMember
CDynamicString
的定义?@johndbling我从我的帖子中提到的两个链接中复制。我认为这里它们的具体定义并不重要。或者你可以阅读更多详细信息我发现如果我使用“{}”,比如CMember m_member{2};那么我可以在头文件中初始化对象成员。但我不知道为什么?”它应该删除“L”。-不,这使它成为一个宽字符串,即一个
常量wchar_t
数组,以匹配
wchar_t*
参数(虽然这需要
const
才能与文本一起使用)。但我不明白,CMember m_成员(2);不能工作,但CMember m_成员{2};可以工作。规则在这里似乎有点奇怪。这部分语法的链接在哪里?@user1914692:语法在标准的附录a中。查找成员声明符,它可以有大括号或相等的初始值设定项,但不能有任何其他形式的初始值设定项。我不知道为什么不允许使用其他形式的初始值设定项;可能是因为使用
()
可能会打开最麻烦的解析的新形式。@user1914692:,我认为§12.6.2/5是相关的部分。谢谢。这很有帮助。虽然快速浏览不会导致我找到相关信息(为什么在初始化中调用构造函数时使用{}而不是()呢).但是让我花更多的时间来搜索它。