这两种类型的运算符重载有什么区别
What is the difference in these two types of operator overloads?
我一直在看一些开源代码,我看到了重载运算符的两种不同定义。它们之间有什么区别,这样做有什么好处吗?
例如,我们有一个类的例子:
class foo{
public:
void SetValue(double input_value) {foo_value = input_value};
double GetValue() {return foo_value;}
private:
double foo_value;
};
然后我有时会看到两种不同类型的/样式的加法运算符重载(例如)
class foo{
const foo operator+(const foo& input_foo);
};
const foo foo::operator+(const foo& input_foo) {
foo_value += input_foo.foo_value;
return *this;
}
我有时看到的另一种类型的过载是:
class foo{
friend const foo operator+(const foo& input_foo1, const foo& input_foo2);
};
const foo operator+(const foo& input_foo1, const foo& input_foo2); // Defined right after class
const foo operator+(const foo& input_foo1, const foo& input_foo2) {
foo temp_foo;
temp_foo.SetValue(input_foo1.GetValue() + input_foo2.GetValue());
return temp_foo;
}
一个重载是成员函数,而另一个是自由函数。
您使用自由函数以提供混合模式算术。例如:-
foo f;
2 + f; __1
__1 只有在有自由函数 operator+
时才编译。在这种情况下,成员函数operator+
不会执行任何操作。
从外部的角度来看,当放置在两个foo
-s之间时,foo::operator+(const foo&)
和::operaor+(const foo&, const foo&)
在使+
符号有意义方面起着完全相同的作用。 特别是第一个就像第二个,当它自己的第一个参数被*this
时。
从内部的角度来看,它们可以在foo
类方面具有不同的功能:::operaor+(const foo&, const foo&)
是一个"自由函数"(在全局级别声明的函数):它在以相同的方式处理参数时具有对称性之美,但无法访问 foo 的私有数据成员,除非 foo 本身不将其识别为自己firend
。
foo::operator+(const foo&)
,作为一个成员函数,可以自由访问所有foo成员和数据,但作为foo的成员,不太适合"通用算法"(可能更喜欢函数形式)。
关于可能的变体还有一些其他区别:考虑
foo a;
foo b;
int k;
上面看到的两种operator+
都可以赋予a+b
意义,但是a+k
和k+a
呢?
对于a+k
,你可以有foo::operator+(int)
或::operator+(const foo&, int)
,但对于k+a,你需要::operator+(int, const foo&)
,因为没有办法+
作为int
的meber。
综上所述,您的声明和实现看起来"模糊"(或至少是不连贯的):
const foo foo::operator+(const foo& input_foo) {
foo_value += input_foo.foo_value;
return *this;
}
当你写c = a+b
时,你期望a
的价值会改变吗?
在这里,您要做的是将b
添加到a
并创建a
的副本(为什么是const?毕竟它是一个副本,并且您已经更改了a
),然后分配给c
。
运算符 + 应创建一个新对象,其值为 总和
foo foo::operator+(const foo& rop) const//注意签名,使其与标注一致{ 傅兜; tmp.foo_value = foo_value + rop.foo_value; 返回 TMP;}
它不是返回类型,而是要const
的成员函数本身,如果通过引用给出参数,以便您确保a+b
既不更改a
也不更改b
。返回类型只是一个普通值,您可以让调用者随心所欲地处理,因为它返回到他自己的堆栈帧中。
- 向量 <int> a {N, 0} 和 int arr a[N] = {0} 的时间复杂度有什么区别
- 在 .h 文件中的类中声明静态变量和在.cpp文件中声明"global"变量有什么区别
- 我是C++编程的新手,这些代码之间有什么区别,我应该使用哪一个
- 返回常量对象引用 (getter) 和仅返回字符串有什么区别?
- Qt:remove() 和 rmdir() 有什么区别
- 这 4 个 lambda 表达式之间有什么区别?
- 将向量作为类>(值)<向量启动和向量<类>[值]有什么区别
- typedef 枚举和枚举类有什么区别?
- &C::c 和 &(C::c) 有什么区别?
- ascii 和 unicode 在处理级别有什么区别吗?
- C 中的常量限定符和 C++ 中的常量限定符有什么区别?
- "ABC" 和 "ABC" ) 在C++中有什么区别?
- 空指针常量 (nullptr)、空指针值和空成员指针值之间有什么区别?
- 引用捕获和在 lambda 中通过引用发送参数有什么区别 (C++)
- 两种访问I2C总线的方法有什么区别?
- 两种模板示例有什么区别?
- 这两种C++语法之间有什么区别?
- lua 5.0.2 模块和 5.3.5 有什么区别?
- C++中"typedef"、"using"、"namespace"和"using namespace"有什么区别?
- std::enable_if 和 std::enable_if_t 有什么区别?