Пример из Дейтела для класса String
Есть перегруженная операция присваивания, но у нее все аргументы TString
const TString &TString::operator=(const TString &right);
Но для char * ничего подобного нет.
Мне непонятен этот момент.
Код:
class TString
{
public:
TString(const char *s=""); // конструктор преобразования
TString(const TString ©); // конструктор копии
~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 ©)
{
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=" << 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;
}
{
public:
TString(const char *s=""); // конструктор преобразования
TString(const TString ©); // конструктор копии
~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 ©)
{
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=" << 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;
}
Код:
TString s1("Поздравляем"), s2(" с днем рождения"), s3;
char strName[20];
cout << endl;
cout << "Введите ваше имя: ";
cin >> strName;
s3 = strName;
char strName[20];
cout << endl;
cout << "Введите ваше имя: ";
cin >> strName;
s3 = strName;
1. Вызывается конструктор преобразования
2. Вызывается operator=
3. Вызывается деструктор
Интересно.
Я так понимаю что здесь происходит создание временного объекта,
потом этот временный объект присваивается s3, и уже после этого он удаляется.
Цитата: deviser
Я так понимаю что здесь происходит создание временного объекта,
потом этот временный объект присваивается s3, и уже после этого он удаляется.
угу, все правильно, вызывается сначала TString(const char *s=""); а потом const TString &operator=(const TString &right);
грубо говоря так:
s3=TString(strName);