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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 04.03.2009, 21:03   #1
Викдон
Форумчанин
 
Аватар для Викдон
 
Регистрация: 11.11.2008
Сообщений: 161
Вопрос Классы

Вот код программы:
Код:
#include "stdafx.h"
#include "iostream"

using namespace std;


class My{
public:
	My(){itsAge=0;}
	~My(){}
	My(My& tt) {itsAge=tt.itsAge;}
	My(int a):itsAge(a){}
	void Set(int a){itsAge=a;}
	
	 My& operator ++ (){
      itsAge++;
	   My Temp(itsAge);
	  return  Temp;
	}
private:
	int itsAge;

};


int main()   
{    
    My Frisky,One;
	Frisky.Set(5);

	 One=++Frisky;

	Frisky++;


    return 0;   
}
В методе operator ++ возвращается ссылка на локальный объект Temp, и в строке "One=++Frisky;" это значение присваивается объекту One. Почему происходит присвоение, если локальный объект удаляется после выхода из метода?
Викдон вне форума Ответить с цитированием
Старый 04.03.2009, 22:23   #2
MaTBeu
Eclipse Foundation
Старожил
 
Аватар для MaTBeu
 
Регистрация: 19.09.2007
Сообщений: 2,604
По умолчанию

Это называтеся вернуть ссылку с правом владения. Тоесть когда вы передаете эту ссылку, то этот объект становиться уже не в области видимости только функции operator++, а в области видимости вызывающей функции.
MaTBeu вне форума Ответить с цитированием
Старый 04.03.2009, 22:46   #3
Викдон
Форумчанин
 
Аватар для Викдон
 
Регистрация: 11.11.2008
Сообщений: 161
По умолчанию

У меня в книге написано что ссылка оснанется на несуществующий объект ...
Викдон вне форума Ответить с цитированием
Старый 04.03.2009, 23:07   #4
pu4koff
Старожил
 
Аватар для pu4koff
 
Регистрация: 22.05.2007
Сообщений: 9,065
По умолчанию

Просто вам повезло, что объект еще не затёрся ничем и деструктор пустой. Лучше так не делать.
Попробуйте этот код:
Код:
#include "stdafx.h"
#include "iostream"

using namespace std;


class My{
public:
	My(){itsAge=0;}
	~My(){cout << "destructor for " << itsAge << endl; itsAge = -100;}
	My(My& tt) {itsAge=tt.itsAge;}
	My(int a):itsAge(a){}
	void Set(int a){itsAge=a;}

	My& operator ++ (){
		cout << "increment for " << itsAge << endl;
		itsAge++;
		My Temp(itsAge);
		return  Temp;
	}
public:
	int itsAge;

};


int main()   
{    
	My Frisky,One;
	Frisky.Set(5);

	cout << Frisky.itsAge << endl;

	One = ++Frisky;
	My &Two = ++One;

	cout << One.itsAge << endl;
	cout << Two.itsAge << endl;

	getchar();
	return 0;   
}
Не правда ли последняя строка интересна? Ой. А сколько деструкторов вызывается
А теперь замените оператор на:
Код:
My& operator ++ (){
		cout << "increment for " << itsAge << endl;
		itsAge++;
		return  *this;
	}
Мне кажется так лучше

Последний раз редактировалось pu4koff; 04.03.2009 в 23:18.
pu4koff вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Классы С++ kims Общие вопросы C/C++ 2 05.03.2009 00:45
Классы bondik Общие вопросы C/C++ 1 14.12.2008 14:19
классы в С++ kadaffi Помощь студентам 1 18.11.2008 09:30
Классы MaxiMILLION Помощь студентам 4 12.10.2008 14:05