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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 06.05.2012, 19:44   #11
Стремящийся
Форумчанин
 
Аватар для Стремящийся
 
Регистрация: 01.11.2011
Сообщений: 172
По умолчанию

Цитата:
А во второй строчке конструктор для h не вызывается. Он вызывается для временного объекта - результата суммы, а потом уже вызывается operator =.
Прошел еще раз отладчиком, все правильно, чего раньше по-другому было. Всем большое спасибо!
Желание тысяча возможностей, нежелание - тысяча причин
Стремящийся вне форума Ответить с цитированием
Старый 07.05.2012, 10:48   #12
rmv240899
Форумчанин
 
Регистрация: 18.02.2012
Сообщений: 155
По умолчанию

h инициализируется, значит вызывается конструктор копирования, но сначала вызывается перегруженный оператор сложения.
rmv240899 вне форума Ответить с цитированием
Старый 07.05.2012, 16:41   #13
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
h какого типа? Rational?
Если мне не изменяет память "=" для объектов вызывает конструктор.
Изменяет. Ключевое слово "=" для экземпляров классов на языке с++ может означать две вещи: запуск конструктора копии, или запуск operator=.

Если ключевое слово"=" использовалось справа от объявления имени объекта, то запустится конструктор копии.

Если же объект уже был создан, и в последствии с нему применить ключевое слово"=", то запустится operator=

Пример 1:

Код:
CSome test1;           //запуск дефолтного конструктора
CSome tes2 = test1; //запуск конструктора копии

CSome test3;          //запуск дефолтного конструктора
test3 = test2;         //запуск operator=
В третьем случае, так как test3 уже был создан, то ключевое слово "=" будет запускать operator=, а не копирующий конструктор.

Пример 2:

Код:
SCome::SCome()
{
    mMember = gRVALUE;
}

SCome::SCome(): mMember(gRVALUE){}

В первом случае, сначала будет создан мембер класса дефолтным конструктором, и только потом, к нему будет применен operator= который изменит состояние мембера на gRVALUE

Получается, что состояние объекта достигается в два прохода: сначала по дефолту, потом изменяется на целевое.

Во втором случае, мембер будет создан при помощи конструктора с явным аргументом, с уже нужным состоянием. И его уже не нужно дополнительно изменять operator=.

Очевидно, что для тяжелых типов второй способ работает быстрее.

Код:
Rational integer1( c, d ),h;// инициализация объекта h
	h=integer + integer1;// вызов operator =
http://liveworkspace.org/code/d1625e...c9cefd22e8c5cb

Последний раз редактировалось _Bers; 07.05.2012 в 16:55.
_Bers вне форума Ответить с цитированием
Старый 07.05.2012, 17:25   #14
Стремящийся
Форумчанин
 
Аватар для Стремящийся
 
Регистрация: 01.11.2011
Сообщений: 172
По умолчанию

Спасибо большое!
Желание тысяча возможностей, нежелание - тысяча причин
Стремящийся вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Перегрузка операции * Maygli Помощь студентам 0 25.04.2012 13:33
Перегрузка операции ввода sawyer1988 Общие вопросы C/C++ 5 22.04.2012 11:59
Перегрузка операции Evgen.O C++ Builder 0 11.12.2011 17:42
перегрузка операции со счетом zhenya.ya Общие вопросы C/C++ 0 03.10.2010 23:52
Перегрузка операции "->*" C++ Geg[C/c++] Общие вопросы C/C++ 3 15.12.2009 12:49