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

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

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 20.01.2013, 14:28   #1
revizor
Форумчанин
 
Аватар для revizor
 
Регистрация: 20.01.2013
Сообщений: 146
По умолчанию Перегрузка операторов для класса

В функции istream &operator>>(istream &input, TString &s) есть присваивание s = temp;
s - это ссылка на TString
temp - это обычная строка символов

Почему при присваивании не происходит ошибка? Ведь в программе нет такой перегруженной операции присваивания

И еще вопрос.
Почему в этой строчке s = temp; выполняются 3 действия
1. Вызывается конструктор преобразования
2. Вызывается оператор operator=
3. Вызывается деструктор

Код:
class TString
{
	friend istream &operator>>(istream &input, TString &s);
	friend ostream &operator<<(ostream &output, const TString &s);
public:
	TString(const char *s="");				
	TString(const TString &copy);			
	~TString();								

	const TString &operator=(const TString &right);
private:
	char *ptr;								
	unsigned int length;				
};



TString::TString(const char *s)
{
	cout << "Конструктор преобразования \"" << s << "\"" << endl;
	
	length = strlen(s);
	ptr = new char[length + 1];

	strcpy(ptr, s);
}

TString::TString(const TString &copy)
{
	cout << "Конструктор копии \"" << copy.ptr << "\"" << endl;

	length = copy.length;
	ptr = new char[length + 1];

	strcpy(ptr, copy.ptr);
}

TString::~TString()
{
	cout << "Деструктор \"" << ptr << "\"" << endl;
	
	delete [] ptr;
}

const TString &TString::operator=(const TString &right)
{
	cout << "Вызов operator=(const TString " << right.ptr << ")" << endl;

	if (this != &right)					
	{
		delete [] ptr;

		length = right.length;
		ptr = new char[length + 1];

		strcpy(ptr, right.ptr);
	}
	else
		cout << "Попытка самоприсваивания TString" << endl;

	return *this;							
}


istream &operator>>(istream &input, TString &s)
{
	char temp[1000];

	input >> temp;

	s = temp;					// Почему здесь не возникает ошибка?

	return input;
}

ostream &operator<<(ostream &output, const TString &s)
{
	output << s.ptr;

	return output;
}
revizor вне форума Ответить с цитированием
Старый 20.01.2013, 17:21   #2
revizor
Форумчанин
 
Аватар для revizor
 
Регистрация: 20.01.2013
Сообщений: 146
По умолчанию

up (может кто ответит...)
revizor вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Перегрузка оператора ifstream >> для класса artemoning Общие вопросы C/C++ 6 05.10.2012 22:38
Перегрузка бинарных арифметических операторов шаблона класса NecroArt Помощь студентам 2 10.08.2010 21:31
C++ Перегрузка операторов. Создать оператор (+) для сложения строк Sanu0074 Помощь студентам 4 05.07.2010 21:29
Функции операторов для класса Superlotles Общие вопросы C/C++ 6 07.06.2010 01:50
Перегрузка операторов, Организация перегрузки операторов chagin_yav Помощь студентам 2 12.05.2008 09:15