假设我有以下基本类,我想重载operator +:
class foo {
private:
arbitrary datatype
public:
foo() { set private data; };
virtual ~foo() {};
};
我一直使用这种格式:
foo operator+( const foo &rhs );
但是,我最近偶然发现了一些人专用的代码:
friend foo operator+( const foo &lhs, const foo &rhs );
那么,使用一个版本而不是另一个版本是标准的吗?是否存在强制进入一个版本的情况(这仅用于添加相同的对象类型)?我不熟悉汇编语言,但编译器是否会将这些语言转换为相同的指令列表(这个问题显然取决于前两个问题的答案)?
答案 0 :(得分:3)
回答您的前两个问题
建议(但不强制执行)对二元运算符使用friend
方法,因为它允许在运算符的左侧具有可转换为类的对象。考虑一下:
class Foo
{
// private members
public:
Foo(int) {/* ctor implementation */} // implicit convertible to int
Foo(const Foo&) { /* copy ctor implementation */ }
friend Foo operator+(const Foo& lhs, const Foo& rhs){/* implementation */}
};
现在你可以做到:
Foo foo1{1};
Foo foo2 = 1 + foo1; // 1 is implicitly converted to Foo here
如果operator+
成为成员函数,则上面的调用将失败(左侧,即使可转换为Foo
,也不会被编译器自动转换),并且您&#39 ; d只能使用
Foo foo2 = foo1 + 1;
因此,总而言之,对二元运算符使用friend
会使它们更加“对称”#34;
上一个问题:
汇编程序不会生成相同的代码,因为朋友/成员operator+
做的事情略有不同。
另请参阅关于重载运算符here的非常良好指南。