gpt4 book ai didi

c++ - 赋值运算符的返回类型

转载 作者:行者123 更新时间:2023-11-30 03:53:34 25 4
gpt4 key购买 nike

用类名定义的运算符有什么区别:

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;
}

什么时候用第一个,什么时候用第二个?

最佳答案

第一个版本允许在一行中对返回的对象做进一步的操作

(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

鉴于返回引用文献的成本非常低,我建议始终返回一个。这将为您省去搜索奇怪错误的痛苦,否则完全正常的语法会破坏您的代码。

关于c++ - 赋值运算符的返回类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30073695/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com