受保护成员的默认值C ++

时间:2019-02-13 05:16:45

标签: c++ initialization

代码:

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

输出

  

_public = 4196960
  _protected = 0
  _private = 4196368

问题:

所有三个成员都未初始化。但是只有publicprivate成员中有垃圾值。为什么将protected成员初始化为零?有什么理由吗?


g ++版本和标志

  

g ++(Ubuntu 5.4.0-6ubuntu1〜16.04.11)5.4.0 20160609

     

-std = c ++ 11

1 个答案:

答案 0 :(得分:1)

首先,请注意,读取uninitialized variables是未定义的行为。 您需要为您的类定义一个构造函数。 这与访问说明符无关。只是发生output.mp4成员位于先前包含值0的地址(对于您而言)。

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

  

5.10标识符[lex.name]

     

3另外,某些标识符保留供C ++实现使用,否则不得使用;没有诊断是   必须。
  ...

     

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