C++ 受保护成员的默认值c++; 代码: #包括 使用名称空间std; 课例 { 公众: 国际公众; friend ostream&operator

C++ 受保护成员的默认值c++; 代码: #包括 使用名称空间std; 课例 { 公众: 国际公众; friend ostream&operator,c++,initialization,C++,Initialization,首先,请注意,阅读是未定义的行为。 您需要为类定义构造函数。 这与访问说明符无关。在您的情况下,受保护的成员恰好位于先前包含值0的地址 最好不要使用以下划线开头的变量名。它们是保留的。 允许在类范围内使用它们,但记住不要在全局范围内使用它们 5.10标识符[法名] 3,此外,某些标识符保留用于C++实现,不应使用;没有诊断是 必需。 (3.2)以下划线开头的每个标识符都保留给 在全局命名空间中用作名称的实现 类范围中的标识符没有问题。标准仅在全局命名空间中保留它们。我刚刚在VS 2017中运

首先,请注意,阅读是未定义的行为。 您需要为类定义构造函数。 这与访问说明符无关。在您的情况下,
受保护的
成员恰好位于先前包含值0的地址

最好不要使用以下划线开头的变量名。它们是保留的。 允许在类范围内使用它们,但记住不要在全局范围内使用它们

5.10标识符[法名]

3,此外,某些标识符保留用于C++实现,不应使用;没有诊断是 必需。

(3.2)以下划线开头的每个标识符都保留给 在全局命名空间中用作名称的实现


类范围中的标识符没有问题。标准仅在全局命名空间中保留它们。我刚刚在VS 2017中运行了上面的代码,得到的所有值都是
0
。运行了几次,但输出没有更改。它是特定于编译器的吗?@P.W是的,我只是出于此示例目的在类sc中使用它们ope.@SaileshD:编译器特定的表示实现定义的行为。读取未初始化的变量不是实现定义的行为,而是未定义的行为。另请参见
返回流;
operator@SaileshD哦,是的。谢谢!您看到了未定义行为的症状。显式初始化t他有一个成员变量,你就不用担心奇怪的值了。@RSahu是的,知道了。谢谢!
#include <iostream>

using namespace std;

class Example
{
public:
    int _public;

    friend ostream& operator<< (ostream& stream, Example& o);

protected:
    int _protected;

private:
    int _private;
};

ostream& operator<< (ostream& stream, Example& o) {
    stream <<
    "_public=" << o._public << endl <<
    "_protected=" << o._protected << endl <<
    "_private=" << o._private << endl;
    return stream;
}


int main(int argc, char const *argv[])
{
    Example e;
    cout << e << endl;
    return 0;
}