C++类和对象(五) 拷贝构造函数

news2024/10/5 21:17:38

1 概念

        在现实生活中,可能存在一个与你一样的自己,我们称其为双胞胎。那在创建对象时,可否创建一个与已存在对象一某一样的新对象呢?

        那在创建对象时,可否创建一个与已存在对象一某一样的新对象呢?

         拷贝构造函数:只有单个形参,该形参是对本类类型对象的引用(一般常用const修饰),在用已存在的类类型对象创建新对象时由编译器自动调用。

        2 特征

        拷贝构造函数也是特殊的成员函数,其特征如下:

        1. 拷贝构造函数是构造函数的一个重载形式。

        2. 拷贝构造函数的参数只有一个必须是类类型对象的引用,使用传值方式编译器直接报错,因为会引发无穷递归调用。

        为什么会出现错误呢,我们知道形参是实参的一份临时拷贝,当我们创建形参的时候,就要对实参进行拷贝,而编译器对于自定义类型调用其拷贝构造函数(对于内置类型,编译器会直接拷贝),因此当我们创建形参的时候就要调用拷贝构造,调用拷贝构造的时候就会创建形参 ...... ........因此形成无穷递归调用。

3. 若未显式定义,编译器会生成默认的拷贝构造函数。 默认的拷贝构造函数对象按内存存储按
字节序完成拷贝,这种拷贝叫做浅拷贝,或者值拷贝。 

注意:在编译器生成的默认拷贝构造函数中,内置类型是按照字节方式直接拷贝的,而自定
义类型是调用其拷贝构造函数完成拷贝的。

4. 编译器生成的默认拷贝构造函数已经可以完成字节序的值拷贝了,但是对于开辟内存的类我们还能这样吗?

typedef int DataType;
class Stack
{
public:
	Stack(size_t capacity = 10)
	{
		_array = (DataType*)malloc(capacity * sizeof(DataType));
		if (nullptr == _array)
		{
			perror("malloc申请空间失败");
			return;
		}

		_size = 0;
		_capacity = capacity;
	}

	void Push(const DataType& data)
	{
	// CheckCapacity();
	_array[_size] = data;
	_size++;
	}
	~Stack()
	{
	if (_array)
	{
		free(_array);
		_array = nullptr;
		_capacity = 0;
		_size = 0;
	}
	}
private:
	DataType* _array;
	size_t _size;
	size_t _capacity;
};

int main()
{
	Stack s1;
	s1.Push(1);
	s1.Push(2);
	s1.Push(3);
	s1.Push(4);
	Stack s2(s1);
	return 0;
}

        答案是:不能!!

        对于日期类的拷贝,没有指针可以浅拷贝(按照字节进行拷贝)。但是对于有指针的类,我们浅拷贝的话,就会造成两个指针指向同一空间,在运行过程会对同一块内存多次初始化和销毁。

注意:类中如果没有涉及资源申请时,拷贝构造函数是否写都可以;一旦涉及到资源申请
时,则拷贝构造函数是一定要写的,否则就是浅拷贝。

5. 拷贝构造函数典型调用场景:

        使用已存在对象创建新对象
        函数参数类型为类类型对象
        函数返回值类型为类类型对象

        为了提高程序效率,一般对象传参时,尽量使用引用类型,返回时根据实际场景,能用引用
尽量使用引用。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1121888.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Linux高性能编程学习-TCP/IP协议族

一、TCP/IP协议族结构与主要协议 分层:数据链路层、网络层、传输层、应用层 1. 数据链路层 功能:实现网卡驱动程序,处理数据在不同物理介质的传输 协议: ARP:将目标机器的IP地址转成MAC地址RARP:将MAC地…

【Java基础面试四十五】、 介绍一下泛型擦除

文章底部有个人公众号:热爱技术的小郑。主要分享开发知识、学习资料、毕业设计指导等。有兴趣的可以关注一下。为何分享? 踩过的坑没必要让别人在再踩,自己复盘也能加深记忆。利己利人、所谓双赢。 面试官:介绍一下泛型擦除 参考…

2023年10月小程序云开发cms内容管理无法使用,无法同步内容模型到云开发数据库的解决方案

一,问题描述 最近越来越多的同学找石头哥,说cms用不了,其实是小程序官方最近又搞大动作了,偷偷的升级的云开发cms(内容管理)以下都称cms,不升级不要紧,这一升级,就导致我…

【Matlab】三维绘图函数汇总

本文用于汇总 Matlab 中的三维绘图函数。plot3() 函数用于绘制用参数方程表示的三维曲线。ezplot3() 函数用于三维曲线的符号绘图,需要用参数方程表示。mesh() 函数用于绘制三维曲面网格。surf() 函数用于绘制三维空间曲面。 目录 1. plot3() 2. ezplot3() 3. me…

中医理疗中药材经营小程序商城的作用是什么

对消费者而言,能找到一家靠谱的中医养生馆很重要,但如非朋友介绍或恰好看到纸质广告等,仅依赖线下跑腿很难找到合适的门店,同时也很费时费力。 同时购买相关产品,也只能前往实体店购买或线上第三方商城,当…

【29】c++设计模式——>策略模式

策略模式 C中的策略模式(Strategy Pattern)是一种行为型设计模式,它允许在运行时选择算法的行为。策略模式通过将算法封装成独立的类,并且使它们可以互相替换,从而使得算法的变化独立于使用算法的客户端。 策略模式通…

2.3.C++项目:网络版五子棋对战之实用工具类模块的设计

文章目录 一、实用工具类模块(一)功能 二、设计和封装(一)日志宏封装(二)mysql_util封装(三)Jsoncpp-API封装(四)file_util封装(五)st…

Linux:实用操作

Linux:实用操作 1. 各类小技巧1.1 controlc(ctrl c) 强制停止1.2 可以通过快捷键:control d(ctrl d),退出账户的登录1.3 历史命令搜索1.4 光标移动快捷键 2. 软件安装2.1 介绍2.2 yum命令(需要root权限)在这里插入图片描述 3. systemctl4.…

【C++11】函数的可变参数模板

文章目录 一. 为什么要有可变参数模板?二. 什么是可变参数模板?三. 如何展开参数包?1. 递归函数方式展开参数包2. 通过初始化列表展开参数包 一. 为什么要有可变参数模板? C98/03 中的模板为能够实现泛型编程提供了便利&#xff…

购买腾讯云服务器如何领取优惠券?

随着云计算技术的不断发展,越来越多的个人和企业开始选择云服务器作为其业务发展的基础。作为国内领先的云计算服务商,腾讯云服务器以其稳定、安全、灵活的特点,受到了广大用户的青睐。为了更好地回馈用户,腾讯云服务器经常会推出…

C++ 类和对象(六)赋值运算符重载

1 运算符重载 C为了增强代码的可读性引入了运算符重载,运算符重载是具有特殊函数名的函数, 也具有其返回值类型,函数名字以及参数列表,其返回值类型与参数列表与普通的函数类似。 函数名字为:关键字operator后面接需…

并发编程-Java内存模型

Java内存模型 在并发编程中,需要处理的两个关键问题: 1)多线程之间如何通信(线程之间以何种机制来交换数据) 2)多线程之间如何同步(控制不同线程间操作发生的相对顺序) 线程之间…

AMD移动FP5平台时序解释

由于刚开始接触AMD移动平台,难免有错误;如有错误请指出共同进步。 配置如下: APU:FP5 Processor EC: ITE5570 CorePMU:RT3662AC 一、基本知识概括 1、IC pin脚信号解释 (1)一般OK是外部信号(对于IC来说是Input);PG是IC发出的(对于IC来说是Output);AMD开机:EN---…

存储优化知识复习三详细版解析

存储优化 知识复习三 一、 选择题 1、 数据库领域的三位图灵奖得主是( )。 A、C.W.Bachman B、E.F.Codd C、Peter Naur D、James Gray 【参考答案】ABD2、 数据库DB、数据库系统DBS、数据库管理系统DBMS三者之间得关系是( )。 A、DB&#…

linux性能分析(四)性能优化导轮

一 别再让Linux性能问题成为你的绊脚石 ① 学习历程 备注: 跟我的学习经历很相像刚工作时遇到的场景跟我现在一样,深深的无力感驱使我继续前行目标: 性能优化成为我的肌肉记忆,写代码的潜意识 ... ② 常见的问题 ③ 性能问题为什么这么难呢 思考&#xff1a…

【驱动开发】创建设备节点、ioctl函数的使用

一、控制三盏灯的亮灭 头文件: #ifndef __HEAD_H__ #define __HEAD_H__ typedef struct{unsigned int MODER;unsigned int OTYPER;unsigned int OSPEEDR;unsigned int PUPDR;unsigned int IDR;unsigned int ODR; }gpio_t; #define PHY_LED1_ADDR 0X50006000 #def…

java读取指定文件夹下的全部文件,并输出文件名,文件大小,文件创建时间

import java.io.IOException; import java.nio.file.*; import java.nio.file.attribute.*; import java.util.ArrayList; import java.util.List; public class Main { public static void main(String[] args) { try { Path startingDir Paths.get("你的目…

带你了解如何防御DDoS攻击

DDoS攻击的类型和方法 分布式拒绝服务攻击(简称DDoS)是一种协同攻击,旨在使受害者的资源无法使用。它可以由一个黑客组织协同行动,也可以借助连接到互联网的多个受破坏设备来执行。这些在攻击者控制下的设备通常称为僵尸网络。 …

人工智能、机器学习、深度学习的区别

人工智能涵盖范围最广,它包含了机器学习;而机器学习是人工智能的重要研究内容,它又包含了深度学习。 人工智能(AI) 人工智能是一门以计算机科学为基础,融合了数学、神经学、心理学、控制学等多个科目的交…

表白墙完善(数据库,前端,后端Servlet),再谈Cookie和Session。以及一个关于Cookie的练习小程序

目录 表白墙引入数据库 再谈Cookie和session 得到Cookie ​编辑 设置Cooie 使用Cookie编写一个登入的小界面 表白墙引入数据库 1.先引入数据库的依赖(驱动包),5.1.49 pom.xml中,在之前的两个之前,再去添加一个 &…