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

时间:2015-08-14 12:15:56

标签: c++ function object const operator-keyword

我是C ++的新手。我读过的那本书告诉我,如果加号(+)运算符已经为某个类对象重载,比如string类,那么这个问题会更加具体。

#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不是可修改的左值。我的问题是为什么+运算符会为string个对象返回一个可修改的左值,而不是int

2 个答案:

答案 0 :(得分:20)

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

但是,类类型的对象可能会重载operator= string。您可以在rvalues上调用成员函数。

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

答案 1 :(得分:14)

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

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

s1 + s2返回右值

会员方法也可以适用于临时。
从C ++ 11开始,我们有方法的左值/右值限定符,
因此,您可以禁止o1 + o2 = o3使用自定义类型:

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

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