Запутанный код C ++, включающий * это? - PullRequest
4 голосов
/ 11 августа 2011

Может кто-нибудь объяснить этот код?Я не понимаю строку 3:

MyString MyString::operator+(const MyString &str)
{
    MyString ss(*this); //----> explain this part
    ss += str;
    return ss;
}

Спасибо!

Ответы [ 5 ]

11 голосов
/ 11 августа 2011

Этот код:

MyString ss(*this);

Говорит "объявите новую переменную типа MyString с именем ss и инициализируйте ее как копию *this."Внутри функции-члена this является указателем на объект-получатель (объект, на который действует функция-член), поэтому *this является ссылкой на объект-получатель.Следовательно, вы можете прочитать это как «создайте новый MyString, который называется ss и является копией объекта получателя».

Используемая здесь идиома реализует operator + в терминах operator +=.Идея состоит в том, чтобы сделать копию объекта-получателя, использовать operator +=, чтобы добавить параметр в копию, а затем вернуть копию.Это широко используемый прием, который упрощает реализацию автономных операторов с учетом реализации соответствующего составного оператора присваивания.

Надеюсь, это поможет!

3 голосов
/ 11 августа 2011

Это пример общей техники повторного использования кода для реализации одного оператора в терминах другого.

Предположим, что мы уже определили составной оператор плюс:

class X
{
  X & operator+=(const X&);
};

Этот унарныйОператор позволяет нам написать a += b, он изменяет a и возвращает ссылку на себя.Это все хорошо и хорошо.Теперь, если мы также хотим предоставить копируемый двоичный оператор плюс оператор a + b, который возвращает новое значение по значению и оставляет значения a и b без изменений, тогда мы хотим воспользоваться уже используемым кодомнаписано для составного оператора.Мы делаем это, вызывая унарный оператор для временной копии из a:

X X::operator+(const X & b) const { return X(*this) += b; }
                                           ^^^^^^^^
                                           temporary copy

Это именно то, что делает ваш код, только более многословно.С таким же успехом вы могли бы написать return MyString(*this) += str;

Существуют и другие идиомы с аналогичным духом, такие как реализация неконстантного доступа с точки зрения константного доступа, копирование-назначение с точки зрения конструкции-копирования и замены,и move-assign в терминах move-construct и swap.Это всегда сводится к тому, чтобы избежать дублирования кода.

1 голос
/ 11 августа 2011

ss - это новая строка, которая создается с помощью конструктора копирования из исходной строки.

1 голос
/ 11 августа 2011

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

1 голос
/ 11 августа 2011

Это конструктор для MyString, который принимает значение текущего объекта (типа MyString) в качестве аргумента.

...