Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 30.01.2010, 08:17   #1
Юра_YUYU
 
Регистрация: 16.01.2010
Сообщений: 8
По умолчанию Конструктор в конструкторе

Добрый день, Господа!
Вопрос на засыпку.
Если я использую в конструкторе класса, конструктор того же класса, но с другой сигнатурой, то вложеный конструктор рассматривается как обычная функция в пространстве имён класса?

код:

class A {
int a;
public:
A() { a = 0; }
A(int b) {
if(b) a = b;
else A();
}
};
Юра_YUYU вне форума Ответить с цитированием
Старый 30.01.2010, 13:05   #2
Blade
Software Engineer
Участник клуба
 
Аватар для Blade
 
Регистрация: 07.04.2007
Сообщений: 1,618
По умолчанию

Конструктор класса нельзя вызывать явно. Он вызывается не явно только в момент создания объекта класса.
Проанализируйте и скомпилируйте такой код, и все станет ясно:
Код:
#include <iostream>

class A
{
public:
    int a;
    A(){ a = 7; }
    A(int b)
    {
        if(b) a = b;
        else A();
    }
};

int main()
{
    A ca(0);
    std::cout << ca.a;
    return 0;
}
З.Ы. я полагал что оно вообще не скомпилируется, однако MinGW компилирует нормально. Но результат, естественно, не такой, как ожидал ТС
Мужество есть лишь у тех, кто ощутил сердцем страх, кто смотрит в пропасть, но смотрит с гордостью в глазах. (с) Ария

Последний раз редактировалось Blade; 30.01.2010 в 13:09.
Blade вне форума Ответить с цитированием
Старый 30.01.2010, 14:19   #3
netrino
Участник клуба
 
Аватар для netrino
 
Регистрация: 15.07.2008
Сообщений: 1,933
По умолчанию

Blade прав, добавлю лишь пояснения, почему это компилируется, но результат не тот, какой ожидалось: дело в том, что A() не вызывает конструктор, а создаёт временный объект класса, только и всего )
Код:
#include <iostream>

class A
{
public:
    int a;
    A(){ a = 7; }
    A(int b)
    {
        if(b) a = b;
        else a = A().a; // ! 
    }
};

int main()
{
    A ca(0);
    std::cout << ca.a; // Теперь вывод будет 7
    return 0;
}
Словом, придётся ждать полноценного воплощения нового стандарта, в котором появилось делегирование конструкторов
netrino вне форума Ответить с цитированием
Старый 30.01.2010, 15:32   #4
Юра_YUYU
 
Регистрация: 16.01.2010
Сообщений: 8
По умолчанию

Спасибо большое. На свой вопрос я получил квалифицированные и полные ответы. )
Юра_YUYU вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
В конструкторе выделяется память под массив. Как быть с перегрузкой оператора = ? TwiX Общие вопросы C/C++ 6 15.12.2009 12:18
Как задать onClick в конструкторе? TwiX Общие вопросы Delphi 4 03.10.2009 20:39
Задать разрядность числа в конструкторе zx11 Общие вопросы C/C++ 5 19.08.2009 19:01
Инициализация массивов в конструкторе. jojahti Общие вопросы C/C++ 7 27.07.2009 13:30
Конструктор PilGrim Общие вопросы C/C++ 0 16.01.2009 10:21