Почему этот элемент данных инициализируется?

Я делаю некоторое тестирование... Во-первых, я публикую свой исходный код

.h файл

class Complex{
    private:
        int r = 0;//initializer
        int i ; 
    public:
        Complex(int , int I = 0);
        Complex();
        void print();
        void set(int, int I = 1);
        static void print_count();
        static int count;
};

файл.cpp

#include <iostream>
#include "complex.h"

int Complex::count = 1;

Complex::Complex(int R , int I){
    r = R;
    i = I;

    count++;

    std::cout << "constructing Complex object...count is " << Complex::count << std::endl;
}

Complex::Complex(){//default constructor
    std::cout << "default constructor is called..." << std::endl;
}

void Complex::print(){
    std::cout << "r = " << r << ';' << "i = " << i << std::endl;
    return;
}

void Complex::set(int R, int I /*= 2*/){//will be "redefaulting", an error
    r = R;
    i = I;
    return;
}

void Complex::print_count(){//static
    Complex::count = -1;//jsut for signaling...

    std::cout << "count is " << count << std::endl;
    return;
}

основная функция

#include <iostream>
#include "complex.h"

int main(){
    Complex d;//using default constructor
    d.print();

    /*Complex c(4, 5);*/
    Complex c(4);
    //c.print();

    /*c.set(2, 3)*/
    c.print();
    c.set(2 );
    c.print();

    std::cout << "count is " << c.count << std::endl;//c can access member data
    c.print_count();
    c.count++;//

    return 0;
}

Рассмотрим сложный объект d, построенный с ctor по умолчанию

поскольку элемент данных r инициализируется с использованием 0, при выполнении d.print() ожидается, что r будет 0

и я не, так что я ожидал, что это будет мусором

но когда я тестирую, происходит одна странная вещь.

если я исключу эту и следующие строки кода в основном файле:

std:: cout << "count is" << c.count << std:: endl; // c может получить доступ к данным члена

тогда d.print() выдаст значение i как 32767 в моей системе, что, по-моему, является мусорным значением;

но как только эта строка добавлена, d.print() просто возвращает значение i в моей системе.

Я не понимаю Я не установил, не изменил и не инициализировал значение, почему оно должно быть 0?

или это тоже мусорная стоимость?

или вызов одной из этих функций портит значение i?

как это работает за сценой здесь?

спасибо за помощь.

1 ответ

0 - такое же мусорное значение, как и любое другое. Не делайте ошибку, думая иначе.

Формально, чтение неинициализированной переменной является неопределенным поведением, поэтому не стоит задумываться об этом: просто исправьте это, правильно инициализировав переменную.

Другие вопросы по тегам