Все элементы данных инициализированы в 0 или им назначены случайные значения конструктором, который вызывается автоматически? - PullRequest
2 голосов
/ 30 марта 2019

Я попытался проверить, какие значения присваиваются элементам данных, когда мы не вызываем конструктор вручную.Я получил 0 для a и b, но получил 1 для c, так как инициализируются члены данных?Случайно или 0?И если они инициализированы в 0, почему я вижу 1 как значение для c?

#include<iostream>
using namespace std;

class Class
{
    public:
        int a,b,c;      
};

int main()
{
    Class obj;

    cout<<obj.a;
    cout<<"\n";
    cout<<obj.b;
    cout<<"\n";
    cout<<obj.c;

    return 0;
}

Вывод 0 0 1

Но я ожидал 0 0 0

1 Ответ

0 голосов
/ 30 марта 2019

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

Компилятор предоставит вам конструктор по умолчанию, потому что вы не определили его самостоятельно и не определили другие конструкторы (в этом случае он будет удален), но конструктор по умолчанию все равно сделает значения членов неопределенными. Вы получали 0 и 1 - я получал числа, похожие на 1515788312.

С помощью стандарта C ++ 11 вы можете предотвратить это, предоставив значения по умолчанию непосредственно в классе,

#include<iostream>
using namespace std;

class Class
{
public:
    int a = 0, b = 0, c = 0;
};

int main()
{
    Class obj;

    cout<< obj.a << " "
        << obj.b << " " << obj.c << endl;

    return 0;
}

В этом случае значения будут инициализированы так, как вам задано. Чтобы добиться того же, вы можете просто предоставить свой собственный конструктор по умолчанию,

#include<iostream>
using namespace std;

class Class
{
public:
    Class() : a(1), b(2), c(3) { }
    int a, b, c;
};

int main()
{
    Class obj;

    cout<< obj.a << " "
        << obj.b << " " << obj.c << endl;

    return 0;
}

В качестве примечания, избегайте using namespace std из-за возможных конфликтов имен. Вместо этого используйте отдельные операторы using - для вещей, которые вы обычно используете, например cout. Я немного изменил вашу программу для ясности. Кроме того, ответы на ваш вопрос можно найти хорошо объясненными в различных книгах по С ++, таких как «Учебник Липпмана», который я использовал

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