[英]The + operator, difference between class types and built-in types?
我是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
?
它不会为字符串返回可修改的左值。 它返回一个临时对象, s1+s2
和x+y
都是rvalues。
但是,类类型的对象可能具有重载的operator=
,即string
。 您可以在rvalues上调用成员函数。
这两种情况之间的区别在于=
(未+
)
对于std::string
, s1 + 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 =
只能应用于左值。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.