Различное поведение C ++ со значением по умолчанию для общедоступной и закрытой области видимости - PullRequest
0 голосов
/ 10 сентября 2018

У меня два вопроса

1) Почему мы можем указать значение по умолчанию, если член является открытым, но когда он является закрытым, нам не разрешается? Возьмите пример ниже:

#include <iostream>
using namespace std;
class Test
{
private:
    int a=5;
public:
    Test()
    {
        cout<<a<<endl;
        cout<<"default const";
        a=0;
    }

};
int main()
{
    Test x;
    cout<<x.a;

}

Мы получаем ниже ошибку для этого:

Compile Errors :
prog.cpp: In function 'int main()':
prog.cpp:6:11: error: 'int Test::a' is private
     int a=5;
           ^
prog.cpp:19:13: error: within this context

Принимая во внимание, что если я сделаю это публично, как показано ниже:

#include <iostream>
using namespace std;
class Test
{ 
public:
    int a=5;
    Test()
    {
        cout<<a<<endl;
        cout<<"default const";
        a=0;
     }

};
int main()
{
    Test x;
    cout<<x.a;

}

Мы получаем вывод как:

5
default const0

2) Мой следующий вопрос: почему у нас такое поведение? Кроме того, когда мы предоставляем это значение по умолчанию, почему значение конструктора переопределяет значение по умолчанию, предоставленное в классе?

Ответы [ 4 ]

0 голосов
/ 10 сентября 2018

Сообщение об ошибке немного вводит в заблуждение; проблема с вашим использованием . Объявление было показано вам для контекста, и поскольку объявление содержит инициализатор, оно выглядит как , ошибка связана с этой инициализацией. Но это не так.

Итак, у нас такого поведения нет.

Что касается того, почему назначение значения элементу «переопределяет» ваше инициализированное значение, ну, это то, что делает назначение. Когда вы инициализируете что-то, оно получает значение, затем, когда вы присваиваете ему это позже, теперь вместо него есть это значение . Это так же, как простая локальная переменная:

int x = 42;
x = 3;

Какое значение имеет x сейчас?

Код в теле конструктора "позже". К моменту запуска все инициализации членов (будь то по умолчанию или с указанными вами значениями) уже завершены.

0 голосов
/ 10 сентября 2018

Мы также можем присвоить значение закрытым переменным-членам, но, похоже, вы обращаетесь к закрытой переменной-члену a вне класса, что недопустимо.

0 голосов
/ 10 сентября 2018

To (2) и, в частности, инициализаторы в классе «почему»: по умолчанию действуют как *1001*, которые не зависят от входных данных, передаваемых конструкторам, тогда как инициализаторы конструктора можно рассматривать как специализацию. Представьте себе класс с 10 конструкторами, для всех из которых требуется одинаковое статическое значение для x, вам следует придерживаться инициализаторов в классе, чтобы избежать избыточного кода.

0 голосов
/ 10 сентября 2018
  1. Участник закрыт, вы получаете сообщение об ошибке, когда пытаетесь его распечатать вне класса.

  2. Достаточно просто, сначала присваиваются все значения по умолчанию (создается, см. Комментарий), затем выполняется код внутри конструктора. Вот почему вы видите 5 внутри конструктора.

Если вы хотите, чтобы конструктор изменил значение инициализации a, вы можете использовать список инициализатора:

Test(): a{0}
{
    cout<<a<<endl;
    cout<<"default const";
}

И это выведет 0, значение a никогда не будет 5 при использовании этого конструктора.

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