当我在操作者超载上查找书籍和堆栈溢出文章时,我发现了以下内容:
当重载运算符是成员函数时,这将绑定到左侧操作数.成员操作符函数比操作数少一个(显式)参数。
(艾迪森·韦斯利,C++ Primer)
所以我的问题是,既然* (dereference)运算符没有任何左操作数,它如何获得它的参数(即对象本身或this)?
发布于 2016-11-02 01:42:00
对于所有前缀一元运算符,它对它后面的操作数进行操作。
另一个问题是,如果将重载*运算符定义为非会员函数与成员函数,那么它的使用方式会有什么不同吗?
大多数情况下,不是,除非非成员函数不能访问该类的私有成员,如果同时存在成员函数和非成员函数,编译器需要使用过载分辨率来选择更高级别的函数,如果没有更好的函数,则是矛盾调用,请参见ADL。
对于可靠的源,您可以查看操作者超载,或者更好的是标准C++中的13.5.1节over.unary:
前缀一元操作符应由无参数的非静态成员函数(9.3)或具有一个参数的非会员函数实现。因此,对于任何前缀一元运算符@,@x可以解释为x.operator@()或运算符@(X)。如果已声明了这两种形式的运算符函数,则13.3.1.2中的规则确定使用哪种解释。关于后缀一元运算符++和--的解释,见13.5.7。2同一运算符的一元形式和二进制形式被认为具有相同的名称。注:因此,一元运算符可以将二进制运算符隐藏在包围作用域之外,反之亦然。-end注记
如果同时有成员和非成员,请参见13.3.1.2 over.match.oper
发布于 2016-11-02 01:25:46
解引用运算符与重载运算符的工作方式与普通运算符的工作方式完全相同。
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,也可以使用重载的*运算符传递类(如迭代器),而且由于重载的*运算符的语法与普通的*运算符相同,所以相同的算法也适用于重载操作符。
https://stackoverflow.com/questions/40371000
复制相似问题