这篇文章主要介绍了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 1和Section 2中的各种方式指定对象的值时,可以方便的确定出各个函数的调用情况。
到此这篇关于C++构造函数+复制构造函数+重载等号运算符调用的文章就介绍到这了,更多相关C++函数调用内容请搜索编程学习网以前的文章希望大家以后多多支持编程学习网!
本文标题为:C++构造函数+复制构造函数+重载等号运算符调用
- C++ 数据结构超详细讲解顺序表 2023-03-25
- C语言qsort()函数的使用方法详解 2023-04-26
- Qt计时器使用方法详解 2023-05-30
- C语言手把手带你掌握带头双向循环链表 2023-04-03
- ubuntu下C/C++获取剩余内存 2023-09-18
- C语言详解float类型在内存中的存储方式 2023-03-27
- 我应该为我的项目使用相对包含路径,还是将包含目录放在包含路径上? 2022-10-30
- 详解C语言中sizeof如何在自定义函数中正常工作 2023-04-09
- Easyx实现扫雷游戏 2023-02-06
- c++ const 成员函数,返回一个 const 指针.但是返回的指针是什么类型的 const? 2022-10-11
