在C++中,利用=
初始化和赋值咋一看很相似,其实背后的实现原理完全不同,本文尝试讲解其中一二,不至于在脑海中混淆两者的概念.
请看如下示例代码:
class Paper {
public:
unsigned int width;
unsigned int height;
public:
Paper() {
cout << "Paper constructor in_1" << endl;
}
Paper(const Paper &paper) {
cout << "Paper constructor in_2" << endl;
this->width = paper.width;
this->height = paper.height;
}
void operator=(Paper &paper) {
cout << "operator = in." << endl;
this->width = paper.width;
this->height = paper.height;
}
};
int main()
{
Paper paper_1;
paper_1.width = 20;
paper_1.height = 10;
cout << "---------------------->" << endl;
Paper paper_2;
paper_2 = paper_1; // 赋值
cout << "width:" << paper_2.width << " height: " << paper_2.height << endl;
cout << "---------------------->" << endl;
Paper paper_3 = paper_1; // 初始化
cout << "width:" << paper_3.width << " height: " << paper_3.height << endl;
cout << "---------------------->" << endl;
Paper paper_4(paper_1); // 初始化
cout << "width:" << paper_4.width << " height: " << paper_4.height << endl;
cout << "---------------------->" << endl;
return 0;
}
打印输出如下:
Paper constructor in_1
---------------------->
Paper constructor in_1
operator = in.
width:20 height: 10
---------------------->
Paper constructor in_2
width:20 height: 10
---------------------->
Paper constructor in_2
width:20 height: 10
---------------------->
分析如下:
paper_2 = paper_1; // 赋值
该语句中paper_1
和paper_2
已经存在,其中的=
完成了赋值操作,调用的是我们重载的operator=
函数.
Paper paper_3 = paper_1; // 初始化
该语句首先调用Paper::Paper()
构造函数,构造出paper_1
,紧接着调用Paper::Paper(const Paper &paper)
构造paper_3
,可见=
完成的并不是一个赋值操作,而是一个初始化(构造)操作.
通过打印能看出来
Paper paper_3 = paper_1; // 初始化
和
Paper paper_4(paper_1); // 初始化
功能是一致的,均完成了初始化操作.