参考this question中报告的代码,我有以下问题,以确保我理解正在发生的事情。
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;
}
a, b
是非const Integer32
,对吧?b = 9
调用我的运算符重载=
,文字9
会发生什么?我的运算符需要const int&
,而我传递的是文字常量。a = b
要求b
为const Integer32&
,这是从Integer32
到const Integer32&
执行的投射?c = a + b
,a,b
是否已转换为常量?答案 0 :(得分:5)
a,b是非const Integer32,对吧?
是。 (我在任何地方都看不到const
,你呢?)
b = 9调用我的运算符重载=,文字9会发生什么?我的 运算符需要一个const int&,而我传递一个文字常量。
9
是int
类型的临时版。除非引用为const
,否则临时传递不允许作为参考传递。在这种情况下,这是真的,临时的生命周期延长,允许Integer32& operator=(const int& x)
。
a = b要求b为const Integer32&amp ;,这是一个执行的转换 从Integer32到const Integer32&?
是。隐式转换由编译器完成。
c = a + b,是a,b是否为常数?
同样适用于这个问题。首先Integer32 operator+(const Integer32& x)
使用操作数a
和b
完成。 (b隐式转换为const Integer32&
)然后Integer32& operator=(const Integer32& x)
使用操作数c
完成,表达式a.operator+(b)
的结果是临时Integer32
。