Почему этот элемент данных инициализируется?
Я делаю некоторое тестирование... Во-первых, я публикую свой исходный код
.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 - такое же мусорное значение, как и любое другое. Не делайте ошибку, думая иначе.
Формально, чтение неинициализированной переменной является неопределенным поведением, поэтому не стоит задумываться об этом: просто исправьте это, правильно инициализировав переменную.