理解一些涉及const类型的C++代码

use*_*759 -1 c++ c++11

参考这个问题中报告的代码,我有以下问题,以确保我理解发生了什么.

class Integer32 {
public:
    Integer32() {
        this->setData(0);
    }
    Integer32(const Integer32& x) {
        this->setData(x.getData());
    }
    Integer32(int data) {
        this->data = data;
    }
    Integer32& operator=(const Integer32& x) {
        if (this != &x) {
            this->setData(x.getData());
        }
        return *this;
    }
    Integer32& operator=(const int& x) {
        this->setData(x);
        return *this;
    }
    Integer32 operator+(const Integer32& x) const {
        return Integer32(this->getData() + x.getData());
    }
    void setData(int data) {
        this->data = data;
    }
    int getData() const {
        return data;
    }
private:
    int data;
};

int main(int argc, char** argv) {
    Integer32 a, b, c;
    a = 7;
    b = 9;
    a = b;
    c = a + b;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)
  1. a, b不是常数Integer32,对吗?
  2. b = 9调用我的运算符重载=,文字会发生什么9?我的运算符需要一个const int&,而我传递一个文字常量.
  3. a = b要求bconst Integer32&,从这里进行铸造Integer32const Integer32&
  4. c = a + b,都是a,b常量?

Som*_*ken 5

a,b是非const Integer32,对吗?

是.(我什么都没看到const,是吗?)

b = 9调用我的运算符重载=,文字9会发生什么?我的运算符需要一个const int&,而我传递一个文字常量.

9是一种临时的类型int.除非参考文献,否则不允许临时传递作为参考const.在这种情况下,这是真的,临时的生命周期延长允许Integer32& operator=(const int& x).

a = b要求b为const Integer32&,这里是一个从Integer32到const Integer32&?的转换.

是.隐式转换由编译器完成.

c = a + b,是a,b是否为常数?

这个问题也是如此.首先Integer32 operator+(const Integer32& x)是操作数ab.(b被隐式转换为const Integer32&)然后Integer32& operator=(const Integer32& x)用操作数c和表达式的结果来完成,a.operator+(b)这是一个临时的Integer32.