当解引用运算符 (*) 被重载时,*this 的使用会受到影响吗?

Posted

技术标签:

【中文标题】当解引用运算符 (*) 被重载时,*this 的使用会受到影响吗?【英文标题】:When the dereference operator (*) is overloaded, is the usage of *this affected? 【发布时间】:2017-11-06 22:12:20 【问题描述】:

例如,

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?
        

如果*this 最终将this 解引用为string 而不是Person,是否有一种解决方法可以保持* 在类外作为解引用运算符的使用?

如果我不能在不放弃使用*this 的情况下超载*,那将是一个很大的障碍。

【问题讨论】:

重载适用于 Person 对象。但是this是一个人指针 @Galik 这个评论应该是一个(接受的)答案。 【参考方案1】:

如果*this 最终将this 解引用为字符串而不是Person,是否有一种解决方法可以将* 用作类外的解引用运算符?

没有。 *this 将是 Person&Person const&,具体取决于功能。重载适用于Person 对象,而不是指向Person 对象的指针。 this 是一个指向 Person 对象的指针。

如果你使用:

 Person p;
 auto v = *p;

然后,调用operator* 重载。

要使用this 调用operator* 重载,您必须使用this->operator*()**this

【讨论】:

建议您在回答中加入@Galik 的解释。【参考方案2】:

您需要类的对象而不是指向类对象的指针来调用重载的* 运算符。

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,您必须取消引用两次:

std::string str = *(*this);

【讨论】:

以上是关于当解引用运算符 (*) 被重载时,*this 的使用会受到影响吗?的主要内容,如果未能解决你的问题,请参考以下文章

c++重载赋值操作符的返回值是啥?

C++里面,为啥重载前++时不返回引用就不能连用?

C++中的重载赋值运算符

从复制赋值重载中通过引用返回

想问大佬++操作符重载,前置和后置的问题?

有关重载运算符的一些思考