C++何时在运算符重载函数前面使用 &
C++ when to use an & in front of an operator overloading function
什么时候需要在运算符声明之前使用&
?
例:
class ClassName {
public:
// Some constructor here..
ClassName operator+(...)
ClassName operator*(...)
ClassName &operator+=(...) < has an &
ClassName operator==(...)
ClassName &operator<<(...) < has an &
private:
// Some member variables here..
}
如果要区分后缀和前缀i++
或++i
请使用&
ClassName &operator++()
ClassName operator++(int)
但是,何时将&
用于其他运算符重载功能?是否有某种规则或与记忆有关?
tl;dr:与任何功能相同。是按值返回,还是按引用返回?
如果你把你的 & 符号左对齐可能会更清楚(这没有语义效果,就像char* str
vschar *str
一样):
ClassName& operator++()
ClassName operator++(int)
因此,选择取决于是否要返回对现有对象的引用:
ClassName& operator++()
{
this->someMember += 1;
return *this;
}
或者一个不错的新:
ClassName operator++(int)
{
// Post-fix operator so we have to return the "old" unmodified version
ClassName old = *this;
this->someMember += 1;
return old;
}
在第一种情况下,按值返回会让++
的用户感到困惑,因为:
- 有一个不必要的副本,并且
- 对
++
结果的进一步操作不会影响原始对象。
在第二种情况下,通过引用返回会很糟糕,因为:
- 它将是对局部变量的悬空引用。
什么时候需要在运算符声明之前使用 &?
& 符号将函数的返回类型声明为引用。更具体地说,是左值引用。因此,当您想要返回左值引用时,您可以使用 &,当您想要返回非引用时不使用 &。
那么,何时要从运算符重载返回引用?简洁的经验法则是,如果非类类型的内置运算符是右值表达式,则应返回引用,当内置运算符是右值表达式时,应返回非引用。这也有例外。例如,有时无法返回引用。也许您需要返回某种行为类似于引用的包装器对象;此类包装器通常按值返回。
赋值运算符(包括复合赋值运算符,如+=
)通常返回对*this
的引用。
后缀运算符通常返回以前的值。因此,它不能返回对包含当前值的*this
的引用。前缀运算符确实返回当前值,因此它可以返回引用。非类对象的前缀增量是一个左值表达式,因此从运算符重载返回左值(即引用)是一个很好的约定。
相关文章:
- "error: no matching function for call to"构造函数错误
- 什么时候调用组成单元对象的析构函数
- 如何在C++向量中奇数元素前面加上值-1,我在使用insert函数时遇到了问题
- 来自 DLL 的函数调用 [表观调用的括号前面的表达式必须具有(指向-)函数类型]
- 在每个可变参数宏参数前面加上 C++ 函数参数的名称
- 为什么在函数参数前面添加 const 会出错?
- C++何时在运算符重载函数前面使用 &
- 如何从前面定义的另一个函数调用函数模板
- 什么意思 :: 在函数调用的前面
- C++函数名称前面的 ~ 是什么意思
- 尝试实现一个函数以删除链表中的结构,同时将它前面的结构分配给它后面的结构
- 前面带有 * 且返回值为 void 的函数声明
- ::c++中模板函数调用前面的作用域解析运算符
- 函数中不必要的弹出指令,前面有if语句
- 函数前面的减号/减号运算符在c++中做什么?
- 如何使用“get”;函数在前面的输入之后
- c++用法:extern在函数前面
- 构造函数主体前面的冒号是否表示继承
- 从函数返回字符串时,如果字符串前面有和结束行,则会错误地打印出来
- 为什么SGI STL源代码在运算符新函数前面使用双冒号