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

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

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

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 20.01.2013, 14:36   #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 в 14:38.
revizor вне форума Ответить с цитированием
Старый 20.01.2013, 14:58   #2
denrubun
Пользователь
 
Регистрация: 24.12.2012
Сообщений: 82
По умолчанию

1) создается временный безымянный объект TString при помощи конструктора преобразования
2) выполняется оператор присваивания, определенный в классе
3) уничтожается временный объект
denrubun вне форума Ответить с цитированием
Старый 20.01.2013, 17:01   #3
revizor
Форумчанин
 
Аватар для revizor
 
Регистрация: 20.01.2013
Сообщений: 146
По умолчанию

Почему компилируется без ошибок? Ведь в программе нет перегруженного оператора присваивания, что-то вроде этого
Код:
const TString &TString::operator=(const char *)
чтобы в правой части был указатель на char
revizor вне форума Ответить с цитированием
Старый 20.01.2013, 17:03   #4
revizor
Форумчанин
 
Аватар для revizor
 
Регистрация: 20.01.2013
Сообщений: 146
По умолчанию

"2) выполняется оператор присваивания, определенный в классе"
Но ведь этот оператор работает только если с левой и с правой стороны от знака = будут TString. А в программе с левой стороны TString а с правой char *

Вообщем, я запутался совсем. Сегодня весь день над этим голову ломаю

Последний раз редактировалось revizor; 20.01.2013 в 17:05.
revizor вне форума Ответить с цитированием
Старый 20.01.2013, 18:01   #5
Ezhik Kihze
Форумчанин
 
Регистрация: 24.12.2012
Сообщений: 639
По умолчанию

У вас есть преобразовывающий конструктор:
Код:
TString(const char *s="");
Вот вы и получаете вместо char* TString
ICQ: 677936656 Gmail: ekEmbed@gmail.com
Ezhik Kihze вне форума Ответить с цитированием
Старый 20.01.2013, 18:55   #6
denrubun
Пользователь
 
Регистрация: 24.12.2012
Сообщений: 82
По умолчанию

1)компилятор смотрит: оппа присваивание char* TString'у это я не умею, чо делать
2)оппа конструктор преобразования char* в TString - это нам подойдет
3)строит безымянный TString из char*
4)присваивает TString'y безымянныйTString
5)удаляет безымянный TString
denrubun вне форума Ответить с цитированием
Старый 20.01.2013, 20:08   #7
revizor
Форумчанин
 
Аватар для revizor
 
Регистрация: 20.01.2013
Сообщений: 146
По умолчанию

Цитата:
Сообщение от denrubun Посмотреть сообщение
1)компилятор смотрит: оппа присваивание char* TString'у это я не умею, чо делать
2)оппа конструктор преобразования char* в TString - это нам подойдет
3)строит безымянный TString из char*
4)присваивает TString'y безымянныйTString
5)удаляет безымянный TString
Спасибо! Теперь вроде все понятно.
revizor вне форума Ответить с цитированием
Старый 20.01.2013, 20:18   #8
sVasilich
Форумчанин
 
Аватар для sVasilich
 
Регистрация: 16.12.2009
Сообщений: 224
По умолчанию

А чтобы компилировалось с ошибками, писать так:

Код:
	explicit TString(const char *s="");				
	explicit TString(const TString &copy);
Люди бывают 10 типов: те, кто понимают двоичную систему счисления, и те, кто не понимают...
sVasilich вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Перегрузка операций manoichi Общие вопросы C/C++ 0 09.01.2012 19:30
С++ Перегрузка операций sir.andrey Помощь студентам 3 08.07.2011 15:18
Перегрузка операций для созданных шаблонов(C#) Mixim Общие вопросы .NET 4 28.09.2010 11:03
Перегрузка операций для класса дробей Fataller Общие вопросы C/C++ 4 29.05.2010 18:08
С++ перегрузка операций для шаблонного класса TIN Помощь студентам 7 29.03.2009 15:24