在C++中重载 "+" 和 "=" 运算符时,构造函数如何调用。
cpp
#include <iostream>
using namespace std;
class Box
{
int length;
std::string name = "box_default";
public:
Box(std::string s) {
name = s;
std::cout << "Default constructor: "<< name << std::endl;
}
Box(const Box& b) {
std::cout << "Copy constructor: "<< b.name << ", length: " << b.length << std::endl;
std::cout << "Copy constructor : this : " << this->name << std::endl;
this->length = b.length;
this->name = "box_copy";
std::cout << "Copy constructor end: this : " << this->name << ", b : " << b.name << std::endl;
}
int getLength(void)
{
return length;
}
void setLength(int len)
{
length = len;
}
// 重载 + 运算符,用于把两个 Box 对象相加
Box operator+(const Box& b)
{
Box box("box+");
box.length = this->length + b.length;
std::cout << "operator+: this: " << this->name << " ,b: " << b.name << std::endl;
return box;
}
Box& operator = (const Box& b) {
std::cout << "operator=: this: " << this->name << ", b: " << b.name << std::endl;
std::cout << "length: " << b.length << std::endl;
this->name = b.name;
this->length = b.length;
return *this;
}
};
// 程序的主函数
int main()
{
Box Box1("box1"); // 声明 Box1,类型为 Box
Box Box2("box2"); // 声明 Box2,类型为 Box
Box Box3("box3"); // 声明 Box3,类型为 Box
// Box1 详述
Box1.setLength(6);
// Box2 详述
Box2.setLength(12);
// Box1
cout << "Length of Box1 : " << Box1.getLength() << endl;
// Box2
cout << "Length of Box2 : " << Box2.getLength() << endl;
// 把两个对象相加,得到 Box3
Box3 = Box1 + Box2;
// Box3
cout << "Length of Box3 : " << Box3.getLength() << endl;
return 0;
}
运行上述代码后的结果:
cpp
Default constructor: box1
Default constructor: box2
Default constructor: box3
Length of Box1 : 6
Length of Box2 : 12
Default constructor: box+
operator+: this: box1 ,b: box2
Copy constructor: box+, length: 18
Copy constructor : this : box_default
Copy constructor end: this : box_copy, b : box+
operator=: this: box3, b: box_copy
length: 18
Length of Box3 : 18
由上述结果可知:
在执行 Box3 = Box1 + Box2;
这句代码时, 先调用了 operator+
, 随后调用拷贝构造函数 Box(const Box& b)
, 最后调用 operator =
.
- 调用
operator+
: 先创建一个 Box 对象 box+, this 指针隐式指向 Box1, Box2作为 引用参数 - 调用拷贝构造函数
Box(const Box& b)
: 此时会调用拷贝构造函数拷贝operator+
的返回值的副本作为operator =
运算的右值 - 最后调用
operator =
.