C ++何时在运算符重载函数前使用&

Mic*_*iel 3 c++ syntax operator-overloading

您何时需要&在运算符声明之前使用?

例:

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..
}
Run Code Online (Sandbox Code Playgroud)

如果您想区分后缀和前缀,i++或者++i使用&

ClassName &operator++()
ClassName operator++(int)
Run Code Online (Sandbox Code Playgroud)

但是,何时&将运算符用于其他运算符重载函数?是否有某种规则或与记忆有关?

Lig*_*ica 8

tl; dr:与任何功能相同。您是通过价值还是参考来回报?


如果将“&”号向左对齐(与char* strvs 一样,没有语义影响),可能会更清楚char *str

ClassName& operator++()
ClassName operator++(int)
Run Code Online (Sandbox Code Playgroud)

因此,选择取决于您是否要返回对现有对象的引用:

ClassName& operator++()
{
    this->someMember += 1;
    return *this;
}
Run Code Online (Sandbox Code Playgroud)

…或一个不错的新产品:

ClassName operator++(int)
{
    // Post-fix operator so we have to return the "old" unmodified version
    ClassName old = *this;
    this->someMember += 1;
    return old;
}
Run Code Online (Sandbox Code Playgroud)

在第一种情况下,按值返回将使您的用户感到困惑++,因为:

  • 有不必要的副本,并且
  • 结果的进一步操作++不会影响原始对象。

在第二种情况下,按引用返回将是不好的,因为:

  • 这将是对局部变量的悬挂引用。


eer*_*ika 6

在运算符声明之前,何时需要使用&?

&符号将函数的返回类型声明为引用。更具体地说,是左值引用。因此,当您要返回左值引用时,请使用&;而当您要返回非引用时,请不要使用&。

因此,何时要从运算符重载返回引用?一条简单的经验法则是,如果非类类型的内置运算符是左值表达式,则应该返回引用,而当内置运算符是右值表达式时,则返回非引用。也有例外。例如,有时您无法返回引用。也许您需要返回某种类似于引用的包装对象。这样的包装器通常按值返回。

赋值运算符(包括复合赋值运算符,例如+=通常返回)的引用*this

后缀运算符通常返回前一个值。因此,它无法返回对的引用*this,其中包含当前值。前缀运算符确实返回当前值,因此它可以返回引用。非类对象的前缀增量是左值表达式,因此从运算符重载返回左值(即引用)是一个很好的约定。