web-dev-qa-db-ja.com

間接参照演算子(*)がオーバーロードされている場合、* thisの使用法は影響を受けますか?

例えば、

class Person{
        string name;
    public:
        T& operator*(){
            return name;
        }
        bool operator==(const Person &rhs){
            return this->name == rhs.name;
        }
        bool operator!=(const Person &rhs){
            return !(*this == rhs); // Will *this be the string name or the Person?
        }
}

*thisthisstringではなくPersonに逆参照することになった場合、逆参照として*の使用を維持する回避策はありますかクラス外の演算子?

*の使用をあきらめずに、*thisをオーバーロードできなければ、かなりの障害になります。

28
user7547935

_*this_がthisPersonではなく文字列に逆参照することになった場合、クラス外の逆参照演算子として_*_の使用を維持する回避策はありますか?

いいえ。_*this_は、機能に応じて_Person&_または_Person const&_になります。オーバーロードは、Personオブジェクトへのポインタではなく、Personオブジェクトに適用されます。 thisは、Personオブジェクトへのポインタです。

使用する場合:

_ Person p;
 auto v = *p;
_

次に、_operator*_オーバーロードが呼び出されます。

thisを使用して_operator*_オーバーロードを呼び出すには、this->operator*()または_**this_を使用する必要があります。

40
R Sahu

オーバーロードされた*演算子を呼び出すには、クラスオブジェクトへのポインタではなく、クラスのオブジェクトが必要です。

Person *ptr = new Person;
Person p1 = *ptr;   // does not invoke * operator but returns the object pointed by ptr
string str = *p1 // invokes the overloaded operator as it is called on an object.

thisポインタの場合も同じです。 thisポインタを使用して* operatorを呼び出すには、次の2回間接参照する必要があります。

std::string str = *(*this);
12
shainu vy