C++ 重载 ->运算符,它是如何工作的?
C++ Overloading -> operator, how does it work?
我试图实现一个类似于标准库auto_ptr的智能指针类,因此我不得不重载 -> 运算符。这是我的代码
template <typename T>
class SmartPtr
{
T * operator -> ()
{
return _pAct;
}
private:
T * _pAct;
};
未显示实现的其余部分,以避免从我的查询中转移。
现在我创建一个类 A 的 SmartPtr,并调用 A 中存在的方法 Show():
SmartPtr smPtr(new A);
smPtr->Show();
这是我的查询(不知道它是否也有效)
由于 SmartPtr::operator->() 返回 A*,因此对 show 的调用应转换为 (A*)Show。为什么它翻译为 (A*)->Show() ?
或者换句话说,smPtr->Show() 表示在任何 smPtr->() 运算符返回的调用 Show() 上如何?
因为运算符->
按顺序应用,直到无法再应用为止。
13.5.6 类成员访问 [over.ref]
1)
operator->
应为非静态成员函数,不采取 参数。它使用-> postfix-expression -> id-expression
解释表达式x->m
实现类成员访问 作为类对象的(x.operator->())->m
,x
类型为T
如果T::operator->()
存在,如果运算符被选为最佳运算符 通过过载解决机制 (13.3) 实现匹配功能。(强调我的)
这意味着,在您的情况下,它转换为:
smPtr.operator->()->Show();
| |
returns A* call Show on the A*
相关文章:
- QSqlquery prepare()和bindvalue()不工作
- 导入库可以跨dll版本工作吗
- 以螺旋方式打印矩阵的程序.(工作不好)
- 对象指针在c++中是如何工作的
- 为什么在Windows上的VS 2019和Clang 9中"size_t"在没有标题的情况下工作
- VSOMEIP-2个设备之间的通信(TCP/UDP)不工作
- 为字符串中每 N 个字符插入空格的函数没有按照我认为的方式工作?
- C++为线程工作动态地分割例程
- 为什么我的 std::ref 无法按预期工作?
- 布尔比较运算符是如何在C++中工作的
- SampleConsensusPrerejective(ext.RANSAC)是如何真正工作的
- 不确定要在我的main中放入什么才能使我的代码正常工作
- 为什么std::condition_variable notify_all的工作速度比notify_one快(对于随机请
- <<操作员在下面的行中工作
- 有人能解释一下为什么下界是这样工作的吗C++的
- ExtractIconEx:可以工作,但偶尔会崩溃
- C++中的memset函数工作不正常
- 当我在第一个循环中使用"auto"时,它工作正常,但是使用"int"它会给出错误,为什么?
- 链表c++插入,所有情况都已检查,但没有任何工作
- 当 int 方法工作正常时,void 方法有何不同,或者为什么我不能调用 void 方法?