使用类名定义的运算符之间有什么区别:
class RefObj {
public:
RefObj &operator=(const RefObj &) { return *this; }
private:
int m_Counter = 0;
};
和void的运算符:
template<class T> class SmartPtr {
public:
void operator=(T* pointer) { m_SmartPtr = pointer; }
private:
T* m_SmartPtr;
}
我应该何时使用第一个?何时使用第二个?
答案 0 :(得分:2)
第一个版本允许在一行中对返回的对象进行进一步操作,如
(refobj = a).do_something();
当您不返回对象的引用时,这是不可能的。您可能认为这很愚蠢,但请考虑输出操作符。
void operator<<(std::ostream &out, const Obj1 &obj1);
std::ostream& operator<<(std::ostream &out, const Obj2 &obj2);
Obj1 obj1;
Obj2 obj2;
std::cout << obj1 << '\t' << obj1 << std::endl; // compiler error
// ^^^^ '<<' can't operate on void
std::cout << obj2 << '\t' << obj2 << std::endl; // works!
// ^^^^ return type is std::ostream, '<<' work on that
鉴于返回引用非常便宜,我建议总是返回一个。这将为您节省搜索奇怪错误的痛苦,否则完全合理的语法将破坏您的代码。