Использование * this в методе класса C ++ для полной перезаписи собственного создания - PullRequest
5 голосов
/ 08 октября 2010

Безопасен ли следующий код? (Я уже знаю, что он правильно компилируется.)

void Tile::clear()
{
    *this = Tile();
}

int main()
{
    Tile mytile;

    mytile.clear();
}

Ответы [ 4 ]

10 голосов
/ 08 октября 2010

Это может сработать. Это зависит от того, как Tile& operator = (const Tile&); реализовано. Однако нет ничего изначально ошибочного в присвоении *this новому значению.

1 голос
/ 08 октября 2010

Код в порядке, и Херб Саттер даже рекомендует вызывать оператор присваивания на this даже внутри конструктора. Я думаю, что это очень чистое, элегантное решение. Даже если поначалу это не сработает, изменение кода для обеспечения его работы, вероятно, потребует очистки.

0 голосов
/ 08 октября 2010

Безопасно, если ваш копировщик не делает ничего противного.

0 голосов
/ 08 октября 2010

Это зависит от реализации. Например, если оператор присваивания полагается на то, что некоторая переменная-член класса Tile уже инициализирована (и это вполне обычно), и эта переменная не инициализируется конструктором Tile до вызова присваивания *this =, которое может выполнить программа в неопределенное поведение.

...