当解引用运算符 (*) 被重载时,*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 的使用会受到影响吗?的主要内容,如果未能解决你的问题,请参考以下文章