+ 运算符,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+s2
和 x+y
都是右值。
但是,class 类型的对象可能已重载 operator=
,而 string
确实如此。您可以在右值上调用成员函数。
两种情况的区别在于=
(不是+
)
对于std::string
,s1 + 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 =
只能应用于左值。
我是 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+s2
和 x+y
都是右值。
但是,class 类型的对象可能已重载 operator=
,而 string
确实如此。您可以在右值上调用成员函数。
两种情况的区别在于=
(不是+
)
对于std::string
,s1 + 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 =
只能应用于左值。