初始化与赋值的区别

在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_1paper_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); // 初始化

功能是一致的,均完成了初始化操作.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值