网站首页 > 技术文章 正文
拷贝构造函数是类的构造函数之一,它在类对象到类对象赋值的时候被调用,英文名Copy-Constructor。
(一)认识拷贝构造函数
它的一般定义如下(粗体显示部分):
class Integer{
int i;
static int count;
Integer(int pi):i(0){
count++;
this->i = pi;
}
Integer(const Integer& ii):i(0){
this->i=ii.i;
count++;
}
};
int Integer::count = 0;
int main(){
Integer one(1);
Integer two = one;
}
其中常量Integer型引用 ii 代表赋值操作中右边的操作数。也就是例子中main函数里的one。
(二)为什么需要拷贝构造函数以及什么时候需要自定拷贝函数
很明显,通过赋值操作(拷贝)产生的对象,其初始化与普通对象的初始化过程必须是不一样的。例子里面的Integer two,通过Integer one拷贝生成,在没有自定义拷贝函数的前提下,它的成员变量和one的成员变量值,是一模一样的。这个时候,编译器会生成并调用默认拷贝构造函数,这个构造函数做的事情,就是位拷贝,也就是把one对象里的所有数据,原封不动等复制到two对象中。
然而,为拷贝通常满足不了用户的需求。上面例子中,程序希望通过静态类变量count来统计所有Integer对象的个数。如果移去粗体部分的自定义拷贝构造函数,count的值永远是1,如论通过拷贝的方式产生了多少对象。显然,这不是程序设计者希望看到的结果。
另外一个用途就是在拷贝的时候,处理指针,引用等地址对象时,使用位拷贝往往不是设计者的初衷。
(三)继承中的拷贝构造函数
构造函数,拷贝构造函数和operator=重载函数,不属于类继承时被派生类继承的函数之列。
另外,由于类赋值操作会默认调用到拷贝构造函数,一些在operator=重载函数实现的逻辑,也可以被挪到拷贝构造函数当中
猜你喜欢
- 2025-10-14 25元、264KB内存的微处理器,树莓派出品,带快速休眠模式
- 2025-10-14 系列专栏(十一):类语法_语法词类
- 2025-10-14 C++ 23的std::print,终于可以和printf说再见了
- 2025-10-14 常指针、函数指针、结构体内部指针、通用指针原理解读
- 2025-10-14 大模型为什么非要在GPU上运行?_为什么做模型
- 2025-10-14 C/C++语言const常量与#define宏常量的比较
- 2025-10-14 C++作死代码黑榜:避坑实战手册_c++代码怎么写
- 2025-10-14 C++ ADL(实参依赖查找/Koenig查找)如何打破可见性规则?
- 2025-10-14 重温C++编程-语法篇-让我们回到C++的世界
- 2025-10-14 C++ 基础与核心概念_c++核心内容
- 最近发表
- 标签列表
-
- cmd/c (90)
- c++中::是什么意思 (84)
- 标签用于 (71)
- 主键只能有一个吗 (77)
- c#console.writeline不显示 (95)
- pythoncase语句 (88)
- es6includes (74)
- sqlset (76)
- apt-getinstall-y (100)
- node_modules怎么生成 (87)
- chromepost (71)
- flexdirection (73)
- c++int转char (80)
- mysqlany_value (79)
- static函数和普通函数 (84)
- el-date-picker开始日期早于结束日期 (76)
- js判断是否是json字符串 (75)
- c语言min函数头文件 (77)
- asynccallback (87)
- localstorage.removeitem (77)
- vector线程安全吗 (70)
- java (73)
- js数组插入 (83)
- mac安装java (72)
- 无效的列索引 (74)