Значение по умолчанию защищенного члена c ++ - PullRequest
0 голосов
/ 13 февраля 2019

Код:

#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 ++ и флаги

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

-стд = с ++ 11

1 Ответ

0 голосов
/ 13 февраля 2019

Во-первых, обратите внимание, что чтение неинициализированных переменных является неопределенным поведением.Вам нужно определить конструктор для вашего класса.И это не имеет ничего общего со спецификаторами доступа.Просто так (в вашем случае), что protected член находится по адресу, который ранее содержал значение 0.

Также лучше не использовать имена переменных, начинающиеся с подчеркивания.Они защищены.Разрешается использовать их в области видимости класса, но не следует использовать их в глобальной области видимости.

5.10 Идентификаторы [lex.name]

3 Кроме того, некоторые идентификаторы зарезервированы дляиспользование реализациями C ++ и не должно использоваться иначе;Диагностика не требуется.
...

(3.2) Каждый идентификатор, начинающийся с подчеркивания, зарезервирован для реализации для использования в качестве имени в глобальном пространстве имен.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...