2012-06-25 6 views
-1

Следующий код никогда не распечатывает счетчик, предполагая, что компилятор делает что-то интеллектуальное, чтобы инициализировать типы данных данных типа нулями?Инициализация члена данных инициализации по умолчанию GCC

include <iostream> 

using namespace std; 

class A { 
    public: 
    int a; 
    int b; 

    A(): b(a), a(b) { } 
}; 

int main() 
{ 
    A* p = new A; 
    int counter = 0; 

    while (!(p->a)) { 
     p = new A; 
     counter++; 
    } 

    cout << counter << endl; 
} 
+0

Это неопределенное поведение. Вы используете неинициализированные переменные для инициализации других переменных. Я бы сказал, что вам посчастливилось получить их как ноль. –

ответ

1

Это неопределенное поведение. a является первым, кто инициализируется и инициализируется b, который является неинициализированной переменной. Если вы хотите значение инициализации (или к 0):

A(): b(), a() { } 

Обратите внимание, что порядок инициализации является порядком, в котором члены появляются в определении класса, а не в списке инициализации членов.

3

Следующий код не выводит счетчик, предполагая, что компилятор делает что-то умно, чтобы инициализировать типы элементов данных INT нулей?

Предположение ошибочное. Значение неинициализированной переменной неопределенно. Это может быть какое-то случайное число, которое просто происходит в памяти.

Изменить конструктор линии к этому:

A(): b(0), a(0) { } 

Это явно инициализирует значения до нуля, а также передает намерение ясно. Помните, что для людей читается код. Компьютер никогда не видит ваш код на C++.

Также обратите внимание, что следующее эквивалентно:

A(): b(), a() { } 

хотя я не использую этот метод инициализации.


Инициализация - не единственная проблема с кодом. Во-первых, у вас огромные утечки памяти в коде, так как вы не делаете delete экземпляры A вы new ред. Go pick up a good introductory C++ book и изучите надлежащий современный C++, поскольку ваше сообщение демонстрирует, что вы не совсем понимаете основы языка.

+0

* pedantic * - '0' внутри круглой скобки является избыточным. –

+0

Кроме того, это не значения, которые обязательно не определены, а все поведение программы. –

+0

@ LuchianGrigore: Поскольку вникание в педантизм: значение неинициализированной переменной равно * Неопределенный * и * не Undefined *. –

Смежные вопросы