#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
这三个成员都未初始化。但只有public
和private
成员才有垃圾价值。为什么protected
成员初始化为零?这有什么理由吗?
g ++(Ubuntu 5.4.0-6ubuntu1~16.04.11)5.4.0 20160609
-std = C ++ 11
首先,请注意阅读uninitialized variables是未定义的行为。您需要为您的类定义构造函数。这与访问说明符无关。它恰好发生(在您的情况下)protected
成员位于以前包含值0的地址。
最好不要使用以下划线开头的变量名。它们是保留的。允许在类范围内使用它们,但请记住不要在全局范围内使用它们。
5.10标识符[lex.name]
3此外,一些标识符保留供C ++实现使用,否则不得使用;无需诊断。 ...
(3.2)以下划线开头的每个标识符保留给实现,以用作全局命名空间中的名称。