Форум программистов, компьютерный форум CyberForum.ru

Конструктор вызывается один раз, а деструктор два раза - C++

Восстановить пароль Регистрация
 
pi_X_el
Заблокирован
07.03.2013, 19:21     Конструктор вызывается один раз, а деструктор два раза #1
Программа для обработки исключений.
Вообщем если ввести два числа и второе будет 0, то конструктор будет вызван 1 раз, а деструктор 2 раза.
Мне вот это непонятно, как такое вообще может быть?

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
#include <iostream>
 
class CDivideByZeroError
{
public:
    CDivideByZeroError() : m_message("Деление на нуль.")     { std::cout << "Конструктор." << std::endl; }
    ~CDivideByZeroError()           { std::cout << "Деструктор" << std::endl; }
    void PrintMessage() const       { std::cout << m_message; }
private:
    const char *m_message;
};
 
double Quotient(int a, int b)
{
    if (b==0)
        throw CDivideByZeroError();
 
    return double(a) / b;
}
 
 
int main()
{
    system("chcp 1251");
 
    int number1, number2;
 
    std::cout << "Введите два целых числа для рассчета их частного: ";
    std::cin >> number1 >> number2;
 
    try                                     // этот блок может сгенерировать исключение
    {
        double result = Quotient(number1, number2);
 
        std::cout << "Частное равно " << result << std::endl;
    }
    catch (CDivideByZeroError error)        // обработчик исключения
    {
        std::cout << "Ошибка: ";  //error.PrintMessage();
 
        std::cout << std::endl;
        system("pause");
        //return 1;
    }
 
    return 0;
}
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
villu
202 / 202 / 4
Регистрация: 06.08.2011
Сообщений: 600
Записей в блоге: 1
07.03.2013, 19:26     Конструктор вызывается один раз, а деструктор два раза #2
На самом деле их вызывается 2, просто второй (конструктор копирования) писал не ты.

Добавь вот что рядом с конструктором

C++
1
2
3
4
5
6
    CDivideByZeroError( const CDivideByZeroError &other )
        : m_message(other.m_message)
    {
        std::cout << "Конструктор." << std::endl;
 
    }
попробуй еще раз.
Desu_Is_A_Lie
 Аватар для Desu_Is_A_Lie
62 / 62 / 3
Регистрация: 26.02.2012
Сообщений: 114
07.03.2013, 19:35     Конструктор вызывается один раз, а деструктор два раза #3
^ this

Поэтому рекомендуется брать ссылки:
C++
1
catch (CDivideByZeroError &error)
pi_X_el
Заблокирован
07.03.2013, 19:36  [ТС]     Конструктор вызывается один раз, а деструктор два раза #4
Цитата Сообщение от villu Посмотреть сообщение
просто второй (конструктор копирования) писал не ты
все понятно. спасибо
проверил. сначала вызывается обычный конструктор а уже потом конструктор копирования
villu
202 / 202 / 4
Регистрация: 06.08.2011
Сообщений: 600
Записей в блоге: 1
07.03.2013, 19:51     Конструктор вызывается один раз, а деструктор два раза #5
Цитата Сообщение от Desu_Is_A_Lie Посмотреть сообщение
Поэтому рекомендуется брать ссылки:
именно! Причем константные
C++
1
catch (const CDivideByZeroError &error)
Yandex
Объявления
07.03.2013, 19:51     Конструктор вызывается один раз, а деструктор два раза
Ответ Создать тему
Опции темы

Текущее время: 02:30. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru