Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Пример из Дейтела для класса String

85K
20 января 2013 года
deviser
10 / / 05.01.2013
Почему в этой строчке s = temp; (TString = char *) используется операция присваивания для класса TString, если мы ее не перегружали?

Есть перегруженная операция присваивания, но у нее все аргументы TString
const TString &TString::operator=(const TString &right);

Но для char * ничего подобного нет.

Мне непонятен этот момент.


Код:
class TString
{
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=" << 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;
}
85K
20 января 2013 года
deviser
10 / / 05.01.2013
Проверил как это все работает.

 
Код:
TString s1("Поздравляем"), s2(" с днем рождения"), s3;
char strName[20];

cout << endl;  
cout << "Введите ваше имя: ";
cin >> strName;

s3 = strName;
В строчке s3 = strName выполняются аж 3 действия:
1. Вызывается конструктор преобразования
2. Вызывается operator=
3. Вызывается деструктор

Интересно.
Я так понимаю что здесь происходит создание временного объекта,
потом этот временный объект присваивается s3, и уже после этого он удаляется.
277
21 января 2013 года
arrjj
1.7K / / 26.01.2011
Цитата: deviser

Я так понимаю что здесь происходит создание временного объекта,
потом этот временный объект присваивается s3, и уже после этого он удаляется.


угу, все правильно, вызывается сначала TString(const char *s=""); а потом const TString &operator=(const TString &right);
грубо говоря так:
s3=TString(strName);

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог