Проблема с функциями-членами по умолчанию класса в C ++ (конструктор, деструктор, operator =, конструктор копирования) (ctor по умолчанию, dtor, копия ctor) - PullRequest
1 голос
/ 27 апреля 2010

Мы знаем, что компилятор генерирует некоторые функции-члены для пользовательского класса, если эти функции-члены не определены, но используются, не так ли? Итак, у меня есть такой код:

class AA
{
};

void main()
{
    AA a;
    AA b(a);
    a = b;
}

Этот код работает нормально. Я имею в виду отсутствие ошибки компилятора. Но следующий код ....

class AA
{
    int member1;
    int member2;
};

Но этот код выдает ошибку времени выполнения, потому что переменная "a" используется без инициализации !!!

Итак, мой вопрос таков: когда мы создаем экземпляр типа int, он имеет значение. Так почему конструктор по умолчанию не работает и с помощью этих двух чисел int инициализируется переменная "a" ??

РЕДАКТИРОВАТЬ: Платформа: Win Vista, компилятор: компилятор Visual Studio 2008; Флаги: по умолчанию

Ответы [ 5 ]

6 голосов
/ 27 апреля 2010

Синтезированный компилятором конструктор по умолчанию вызывает конструкторы по умолчанию для всех членов класса, которые имеют конструкторы. Но целые числа не имеют конструкторов и поэтому не инициализируются. Однако мне трудно поверить, что это приведет к ошибке во время выполнения.

Для инициализации этих переменных:

class AA {
  public:
     AA() : member1(0), member2(0) {}
  private:
    int member1;
    int member2;
};
1 голос
/ 27 апреля 2010

Во-первых, с практической точки зрения это не является настоящей ошибкой во время выполнения. Это встроенная функция отладки вашей среды разработки. Компилятор пытается отловить ситуации, когда вы читаете неинициализированное значение, что и происходит в вашем случае.

Во-вторых, когда мы «создаем» экземпляр int, он не имеет значения . Точнее, он содержит неопределенное значение, которое даже не гарантируется как стабильное (вы можете получить разные значения, прочитав одну и ту же неинициализированную переменную несколько раз подряд). Теоретически, чтение неинициализированной переменной int приводит к неопределенному поведению, поскольку оно может содержать недопустимое ("ловушку") представление. Фактически, вы можете воспринимать вашу «ошибку времени выполнения», генерируемую вашей средой разработки, как проявление этого неопределенного поведения.

0 голосов
/ 27 апреля 2010

Во-первых, когда вы создаете экземпляр типа int без его инициализации, он имеет неопределенное значение. Встроенный базовый тип не имеет конструктора.

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

В-третьих, ваша подпись для main неверна - правильная подпись

int main(void)
0 голосов
/ 27 апреля 2010

На самом деле, конструкторы по умолчанию и конструкторы копирования работают. Но в cpp неинициализированные переменные на самом деле содержат мусор. Следовательно, вы получаете сообщение об ошибке (int member1, int member2 содержит мусор, и вы пытаетесь назначить этот мусор объекту b).

0 голосов
/ 27 апреля 2010

Какая платформа? компилятор? флаги компилятора? У вас должна быть добавлена ​​дополнительная проверка, потому что в обычном C ++ нет ничего, что проверяло бы статус инициализации.

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