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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 27.03.2011, 22:37   #1
Сtrl
C++
Форумчанин
 
Аватар для Сtrl
 
Регистрация: 27.03.2011
Сообщений: 803
Вопрос Конструктор копирования

Поля класса:
Код:
int field1;
int field2;
В конструктор копирования объект передается по ссылке:
Код:
CMyClass::CMyClass(const CMyClass& value)
{
	field1 = value.field1;
	field2 = value.field2;
}
Помимо этого, для класса перегружена операция сложения:
Код:
CMyClass& CMyClass::operator * (const CMyClass& value)
{
	CMyClass result(*this); /* тут конструктор копирования работает хорошо */
	result.field1 += value.field1;
	result.field2 += value.field2;
	return
		result;
}
Но когда я пытаюсь использовать это вместе:
Код:
CMyClass Object1(2,5); /* создан первый объект, поля класса проинициализированы */
CMyClass Object2 (Oblect1 + Object1); /*тут конструктор дает сбой. Потому что в итоге в Object2 поля равны -858993460, то есть как-будто их не инициализировали */
Почему я уверен, что лажает именно конструктор копирования? Дело в том, что если его убрать, то создаваемый автоматически конструктор копирования исправно работает!
Путем пошагового исполнения я отследил, что оператор сложения корректно возвращает значение.
Какие будут мысли по этому поводу?
Ищете информацию по C++?
cplusplus.com
Сtrl вне форума Ответить с цитированием
Старый 27.03.2011, 22:52   #2
netrino
Участник клуба
 
Аватар для netrino
 
Регистрация: 15.07.2008
Сообщений: 1,933
По умолчанию

Цитата:
Сообщение от Сtrl Посмотреть сообщение
Код:
CMyClass& CMyClass::operator * (const CMyClass& value)
{
	CMyClass result(*this); /* тут конструктор копирования работает хорошо */
	result.field1 += value.field1;
	result.field2 += value.field2;
	return
		result;
}
Красный амперсанд нужно убрать, нельзя возвращать ссылки на локальные переменные
netrino вне форума Ответить с цитированием
Старый 27.03.2011, 22:55   #3
Сtrl
C++
Форумчанин
 
Аватар для Сtrl
 
Регистрация: 27.03.2011
Сообщений: 803
По умолчанию

Ох, заработало. Спасибо!
Остается только вопрос: почему тогда создаваемый автоматически конструктор невозбранно работал со ссылкой на локальную переменную?
Ищете информацию по C++?
cplusplus.com

Последний раз редактировалось Сtrl; 27.03.2011 в 22:57.
Сtrl вне форума Ответить с цитированием
Старый 29.03.2011, 00:08   #4
netrino
Участник клуба
 
Аватар для netrino
 
Регистрация: 15.07.2008
Сообщений: 1,933
По умолчанию

Вероятнее всего, компилятор производил некие оптимизации при неопределённом конструкторе копирования, либо же встраивал его в код, и, таким образом избавившись от вызова, не затиралось значение result из стека. Чтобы сказать конкретнее нужно смотреть под отладчиком, но особого смысла в этом не вижу, так как в любом случае, возвращать ссылки/указатели на локальные автоматические переменные функции нельзя.
netrino вне форума Ответить с цитированием
Старый 29.03.2011, 21:09   #5
Сtrl
C++
Форумчанин
 
Аватар для Сtrl
 
Регистрация: 27.03.2011
Сообщений: 803
По умолчанию

netrino, весьма исчерпывающее объяснение. Благодарю.
Ищете информацию по C++?
cplusplus.com
Сtrl вне форума Ответить с цитированием
Старый 31.03.2011, 08:10   #6
zeroname
Новичок
Джуниор
 
Регистрация: 07.03.2011
Сообщений: 2
По умолчанию

Цитата:
Сообщение от Сtrl Посмотреть сообщение
Ох, заработало. Спасибо!
Остается только вопрос: почему тогда создаваемый автоматически конструктор невозбранно работал со ссылкой на локальную переменную?
А почему вы решили, что конструктор не может получать в качестве аргумента ссылку на локальную переменную? Как я понимаю, во время работы конструктора переданная ему по ссылке локальная переменная еще существует, и соответственно проблем не возникает...
zeroname вне форума Ответить с цитированием
Старый 31.03.2011, 10:18   #7
zeroname
Новичок
Джуниор
 
Регистрация: 07.03.2011
Сообщений: 2
По умолчанию

Что-то я стормозил и не въехал сразу в суть вопроса. Прошлый пост я сделал не подумав. Сорри...
zeroname вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Конструктор копирования DartDayring Общие вопросы C/C++ 4 16.11.2010 17:46
Конструктор копирования. 123er4 Общие вопросы C/C++ 4 13.06.2010 01:27
Конструктор копирования Superlotles Общие вопросы C/C++ 2 24.05.2010 17:39
Конструктор копирования Djaconda Общие вопросы C/C++ 3 11.06.2008 18:54