3mr*_*3mr 6 c++ operator-overloading
我试图了解重载 - >运算符是如何工作的.我有以下课程
class Message {
public:
Message(string message) :m_text(message) {}
void printText() {
cout << "text is " << m_text << endl;
}
string m_text;
};
class MessagePointerWrapper
{
public:
MessagePointerWrapper(string message) {
m_message = std::make_unique<Message>(message);
}
Message* operator->() {
return m_message.get();
}
std::unique_ptr<Message> m_message;
};
int main(int argc, char** argv)
{
MessagePointerWrapper messageWrapper = MessagePointerWrapper("Hello World");
messageWrapper.m_message->printText();
messageWrapper->m_text = "PQR";
messageWrapper.m_message->printText();
}
Run Code Online (Sandbox Code Playgroud)
该MessageWrapper
级的->
运算符重载以返回Message*
.所以在主要方法中,当我调用messageWrapper->
它返回的是一个Message*
.通常当我有一个指针时,我需要使用->
运算符或deference运算符来访问该对象.根据该逻辑,为了访问对象的m_text
可用性Message
,代码应该写成如下
(messageWrapper->) // this returns a pointer to Message. so to access the object, I should write as
(messageWrapper->)->m_text = "PQR"
Run Code Online (Sandbox Code Playgroud)
要么
*(messageWrapper->).m_Text = "PQR"
Run Code Online (Sandbox Code Playgroud)
但这不起作用,我需要称之为
messageWrapper->m_text = "PQR";
Run Code Online (Sandbox Code Playgroud)
我不明白这里的逻辑.我能否澄清一下这个问题.
==============
进一步说明:
在主要方法中,我看到以下两种方法做同样的事情
messageWrapper.operator->()->m_text = "JKH";
messageWrapper->m_text = "JKH";
Run Code Online (Sandbox Code Playgroud)
这是否意味着运营商的->
工作方式与其他运营商不同
messageWrapper->
等同于(messageWrapper.operator->())->
而不是messageWrapper.operator->()
其他运营商的情况.
正如标准所述,[over.ref]/1
表达式
x->m
被解释为类型为if(x.operator->())->m
的类对象x
,T
如果T::operator->()
运算符被重载决策机制选为最佳匹配函数
这意味着messageWrapper->m_text
是一种语法糖(messageWrapper.operator->())->m_text
.您可以明确地应用后一种风格,但前者更有效.重载operator->
使得可以像使用原始指针一样使用类,这就是智能指针喜欢std::unique_ptr
和std::shared_ptr
工作的方式.
标准说:
13.5.6类成员访问
表达式
x->m
被解释为类型为if(x.operator->())->m
的类对象x
,T
如果T::operator->()
运算符被重载决策机制选为最佳匹配函数