说我有课
class A{
A& operator+ (size_t ofst)
{
//some calculation
//return
}
};
在这里我不能写
return this;
因为 A* 不能转换为 A&。那么如何实现这个呢?我想返回一个引用而不是一个指针。
作为类比,流类有 >> 或 << 运算符。据我所知,这两个返回对自身的引用。标准库如何实现这一点?
写*this
。
一元运算*
符执行取消引用。因此,您从指针开始this
,然后申请*
获取它所指向的东西,即实际的底层对象。
的结果*this
实际上不是引用,而是一个左值,然后它会愉快地绑定到作为函数/运算符的返回值的引用。
至于流是如何做到的,流的大多数运算符重载都是非成员:
std::ostream& operator<<(std::ostream& os, const MyType& obj)
{
os << obj.someStringRepresentationIGuess();
return os;
}
那些不是将返回*this
:
std::ostream& std::ostream::operator<<(int x)
{
doSomethingToAddIntToBuffer(x);
return *this;
}
这通常不适用于诸如 之类的运算符+
,尽管它适用于+=
:
class A
{
A operator+(size_t ofst)
{
A tmp = *this;
tmp += ofst;
return tmp;
}
A& operator+=(size_t ofst)
{
// some calculation
return *this;
}
};
这是因为约定+
适用于新对象;否则,以下代码的结果将完全令人惊讶:
int x = 5;
int y = x + 2;
// is y 5 or 7?
// is x 5 or 7?
return *this;
瞧。
如果要将指针分配给引用,则必须取消引用它。
您只需返回 *this。除非在空指针上调用成员函数本身,否则它不会为空。