解引用操作符(*)作为类的成员函数重载时是如何工作的?
How does dereference operator (*) work when overloaded as a member function of a class?
当我查找有关操作符重载的书籍和堆栈溢出文章时,我发现了以下内容:
当重载操作符是成员函数时,它被绑定到左操作数。成员操作符函数少一个(显式)
(Addison Wesley, c++ Primer)
所以我的问题是,因为*
(解引用)操作符没有任何左操作数,它如何得到它的参数(这是对象本身或this
)?
对于所有前缀一元操作符,它的操作对象都是紧跟其后的操作数。
作为一个附加的问题,如果将重载*操作符定义为非成员函数和成员函数,在如何使用*操作符方面会有什么不同吗
在大多数情况下,除了非成员函数不能访问该类的私有成员,如果成员函数和非成员函数都存在,编译器需要使用重载解析来选择高秩的函数,如果没有更好的函数,则是歧义调用,参见ADL
要获得可靠的源代码,您可以查看操作符重载,或者更好的方法是参见第13.5.1节。标准c++中的unary]:
前缀一元操作符应由不带形参或的非静态成员函数(9.3)实现带有一个参数的非成员函数。因此,对于任何前缀一元操作符@,都可以解释@x作为x.operator@()或operator@(x)。如果已经声明了两种形式的操作符函数,则13.3.1.2中的规则决定使用哪种解释(如果有的话)。有关后缀的解释,请参见13.5.7一元操作符++和——。同一运算符的一元和二元形式被认为具有相同的名称。[注:因此,一元操作符可以对封闭作用域隐藏二进制操作符,反之亦然。端注意]
对于同时存在成员和非成员的选择,参见13.3.1.2 [over.match.oper]
前缀*
对其后面的操作数进行操作。
对于表示为成员函数的用户定义的operator*
,它是由this
表达式引用的对象。
#include <iostream>
using namespace std;
struct S
{
auto operator*() const -> char const* { return "Hi there!"; }
};
auto main()
-> int
{ cout << *S() << endl; }
结果:<>之前大家好! 解引用操作符的工作方式与重载操作符和普通操作符完全相同。
int foo(int *p)
{
return *p;
}
在语句return *p;
中,解引用操作符适用于指针p
。它被传递到右边:
作为重载操作符,其工作方式相同。
class bar {
int *some_internal_ptr;
public:
int operator*() const {
return *some_internal_ptr;
}
// Other class members and methods...
};
int foo(bar p)
{
return *p;
}
当*
操作符的右侧是具有操作符* '成员的类时,它被作为类的重载方法调用,与任何其他成员没有区别,以解决解引用问题。
正是因为用法相同,所以许多c++库算法在指针和c++库操作符上都能很好地工作。例如,std::copy()
可以按照以下方式实现(我正在修剪一些不相关的复杂性,在这里不相关):
template<typename iter_type>
iter_type copy(iter_type b, iter_type e, iter_type t)
{
while (b != e)
{
*t=*b;
++t;
++b;
}
return t;
}
您可以将本机指针传递给std::copy
,或者传递带有重载*
操作符的类(如迭代器),并且由于重载*
操作符与普通*
操作符的语法相同,因此也可以使用相同的算法处理重载操作符。
- 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 方法?