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

问题描述 投票:1回答:1

码:

#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

c++ initialization
1个回答
1
投票

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

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

5.10标识符[lex.name]

3此外,一些标识符保留供C ++实现使用,否则不得使用;无需诊断。 ...

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

© www.soinside.com 2019 - 2024. All rights reserved.