+ 运算符,class 类型和内置类型的区别?

The + operator, difference between class types and built-in types?

我是 C++ 新手。我读的书告诉我,如果加号 (+) 运算符已为某些 class 对象重载,例如 string class,使这个问题更具体.

#include<iostream>
#include<string>
using namespace std;

int main()
{
    string s1("abc");
    string s2("def");

    string s3("def");

    cout<<(s1+s2=s3)<<endl;

    int x=1;
    int y=2
    int z=3;
    cout<<(x+y=z)<<endl;

    return 0;
}

如您所料,第一个 cout 陈述是正确的,而第二个是错误的。编译器抱怨 x+y 不是可修改的左值。我的问题是为什么 + 运算符 returns 是 string 对象的可修改左值而不是 int?

它不是 return 字符串的可修改左值。它 return 是一个临时对象, s1+s2x+y 都是右值。

但是,class 类型的对象可能已重载 operator=,而 string 确实如此。您可以在右值上调用成员函数。

两种情况的区别在于=(不是+

对于std::strings1 + s2 = s3实际上是:

(operator+(s1, s2)).operator =(s3)

s1 + s2 returns 右值

成员方法也可以应用于临时。
从 C++11 开始,我们有方法的 lvalue/rvalue 限定符,
所以你可以禁止 o1 + o2 = o3 你的自定义类型:

struct Object
{
    Object& operator =(const Object& rhs) & ; // Note the & here
};

所以Object::operator =只能应用于左值。