【问题标题】:The + operator, difference between class types and built-in types?+ 运算符,类类型和内置类型之间的区别?
【发布时间】:2015-11-07 16:47:22
【问题描述】:

我是 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

【问题讨论】:

  • 在 C++ 中,对象是任何类型的实例,包括内置类型。类型就是类型。所以“对象”与“内置类型”没有任何意义。
  • @juanchopanza 提供正确的措辞会很有用:)
  • @Quentin 我猜“内置类型和用户定义类型之间的差异”是准确的。

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


【解决方案1】:

对于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 =只能应用于左值。

【讨论】:

    【解决方案2】:

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

    但是,类类型的对象可能已经重载了operator=string 就是这样做的。您可以在右值上调用成员函数。

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

    【讨论】:

    • 请注意,这是worked on 的问题。您可以阻止在您自己的类的 rvalues 上调用 operator=。问题是,如果将 C++ 标准更改为禁止分配给std::string rvalues,现有代码将会中断。
    • @MSalters 是的,a wise man 曾经问过同样的问题..:)
    猜你喜欢
    • 2012-12-09
    • 1970-01-01
    • 1970-01-01
    • 2021-01-12
    • 2013-11-17
    • 2013-10-05
    • 2016-09-28
    • 2013-05-19
    • 2017-03-15
    相关资源
    最近更新 更多