欢迎来到代码驿站!

C代码

当前位置:首页 > 软件编程 > C代码

C++构造函数+复制构造函数+重载等号运算符调用

时间:2022-10-10 12:51:35|栏目:C代码|点击:

前言:

初学C++发现了下面这个问题,其中Duck是一个已知的类,并以多种方式指定对象的值:

Duck d1();
Duck d2(d1);
Duck d3 = d1;
Duck d4;
d4 = d1;

问题在于,上述d1、d2、d3、d4是如何创建的呢?分别调用的哪个函数呢?

1、赋值和初始化的区别

C++中,赋值和初始化是两个不同的概念:

  • 初始化是指对象创建之时指定其初值,分为直接初始化和复制初始化两种(一句);
  • 赋值是指对象创建以后指定其值(两句);

对于上述d1、d2、d3、d4的创建来说,分别对应下述情况:

Duck d1();    // 直接初始化
Duck d2(d1);  // 复制初始化
Duck d3 = d1; // 复制初始化
Duck d4;      // 未初始化
d4 = d1;      // 赋值

2、初始化和赋值分别调用哪个函数?

直接初始化时,参数为对象所需的值,此时调用构造函数;复制初始化时,参数是一个已存在的类对象,此时调用复制构造函数;赋值时,对象是已经定义好的,调用“重载的等号赋值操作”,使用另一个对象的值计算出此对象的值。

Duck d1();    // 调用构造函数
Duck d2(d1);  // 调用复制构造函数
Duck d3 = d1; // 调用复制构造函数
Duck d4;      // 
d4 = d1;      // 赋值

需要特别注意的是下面两种方式都是初始化,而且都是调用的复制构造函数,容易误以为第二种方式是赋值:

Duck d2(d1);
Duck d3 = d1;

3、编写测试类

对于上述Duck类的初始化以及赋值方式,为了正确的测定每种情况分别调用了什么函数,下面的类中包含了构造函数、复制构造函数、重载等号赋值运算符函数:

class Duck{
public:
    Duck() { cout << "constructing !!!" << endl; };
    Duck(const Duck &d) { cout << "copying !!!" << endl; }
    Duck& operator=(const Duck &another);
};

Duck& Duck::operator=(const Duck &another) {
    cout << "operator= !!!" << endl;
    return *this;
}

使用Section 1Section 2中的各种方式指定对象的值时,可以方便的确定出各个函数的调用情况。

上一篇:一起来学习C++中remove与erase的理解

栏    目:C代码

下一篇:C语言超全面讲解函数的使用方法上

本文标题:C++构造函数+复制构造函数+重载等号运算符调用

本文地址:http://www.codeinn.net/misctech/215958.html

推荐教程

广告投放 | 联系我们 | 版权申明

重要申明:本站所有的文章、图片、评论等,均由网友发表或上传并维护或收集自网络,属个人行为,与本站立场无关。

如果侵犯了您的权利,请与我们联系,我们将在24小时内进行处理、任何非本站因素导致的法律后果,本站均不负任何责任。

联系QQ:914707363 | 邮箱:codeinn#126.com(#换成@)

Copyright © 2020 代码驿站 版权所有