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

Understanding some C++ code involving const type&

本文关键字:类型 C++ 代码 const 了解      更新时间:2023-10-16

关于这个问题中报告的代码,我有以下问题来确保我理解发生了什么。

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;
}
  1. a, b是非常量Integer32,对吧?
  2. b = 9调用我的运算符重载=,文字9会发生什么?我的运算符需要一个const int&,而我传递一个文字常量。
  3. a = b需要b const Integer32&,这里的选角是从Integer32const Integer32&进行的吗?
  4. c = a + b ,两者都a,b转换为常量吗?

a,b是非常量整数32,对吧?

是的。(我在任何地方都看不到const,是吗?

b = 9

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

9int 类型的临时。不允许将临时项作为引用传递,除非引用const。在这种情况下,这是真的,临时的寿命延长了,允许Integer32& operator=(const int& x) .

a = b 要求 b 是常量 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