Почему я не могу установить * this == объект класса - PullRequest
1 голос
/ 04 мая 2020

Я проверял на операторе перегрузки =. Почему я могу установить 'this == & st', а не '* this == st'?

StringBad & StringBad::operator=(const StringBad & st)
{
    if (this == &st)           // if the object assigned to itself, return to itself. 
        return *this;          // why compiler give error when I set *this ==st ?

/* blah blah
...
... */

    return *this;              // return reference to invoking object
}

Ответы [ 3 ]

2 голосов
/ 04 мая 2020

Два разных объекта могут быть равны друг другу, но это не значит, что они одинаковы.

Рассмотрим, например,

#include <iostream>
#include <iomanip>

int main() 
{
    int x = 0;
    int y = 0;

    std::cout << "x == y is " << std::boolalpha << ( x == y ) << '\n';
    std::cout << "&x == &y is " << std::boolalpha << ( &x == &y ) << '\n';
}

Вывод программы:

x == y is true
&x == &y is false

Так что эта проверка this == &s необходима, чтобы определить, есть ли здесь самоотдача.

2 голосов
/ 04 мая 2020

Сравнение двух указателей не - это то же самое, что сравнение значений в этих указателях. например,

int *a, *b;
if(a == b) 
if (*a == *b) // not the same

Конечно, если 2 указателя совпадают, то они указывают на одно и то же значение, но обратное неверно.

В этом случае проверяется, если *this == st скомпилируется (предполагая, что operator== определено для StringBad), но это не то же самое, что проверка, если this == &st.

0 голосов
/ 04 мая 2020

Почему я могу установить this == &st, но не *this == st?

Я думаю, вы хотите сказать, почему я могу использовать this == &st, но не *this == st?

Не обращая внимания на минуту, ответ таков: да, вы можете, но это не всегда правильно делать всегда. Это может быть подходящим для вашего случая. В этом случае вы должны обязательно использовать его. Конечно, это подразумевает, что вам нужно сначала реализовать operator== для вашего класса.

Вот пример, где вам не следует использовать *this == st, чтобы сделать присвоение oop.

Допустим, у вас есть класс, который захватывает физическую величину со значением и единицами, и, скажем, у вас есть:

объект a, который представляет 1 "м".
объект b, который представляет 100 см

Когда вы сравните a с b, вы должны вернуться true. Но когда вы назначаете a на b или наоборот, IMO вы должны приступить к назначению.

...