首页 > 编程语言 >C++类拷贝控制 深拷贝 浅拷贝

C++类拷贝控制 深拷贝 浅拷贝

时间:2024-04-10 12:34:46浏览次数:21  
标签:控制 C++ 运算符 编译器 默认 拷贝 构造函数 赋值

参考博文:https://www.cnblogs.com/zhxmdefj/p/11579364

拷贝构造函数,拷贝赋值运算符

拷贝构造函数

第一个参数是自身类类型引用,其他参数都有默认值的构造函数就是拷贝构造函数。

class Sales_data{

public:

      Sales_data();    //默认构造函数

      Sales_data(const Foo&);  //默认拷贝构造函数

};

拷贝构造函数用来初始化非引用类类性参数,所以拷贝构造函数自己的参数必须是引用类型

为什么一定要是引用类型?

因为如果不是引用,那么调用拷贝构造函数,必须拷贝它的实参,为了拷贝实参,又需要调用拷贝构造函数,无限循环。

合成拷贝构造函数(默认)

和默认构造函数一样,编译器会帮你定义一个默认拷贝构造函数(如果不手动定义的话),不同的是,

如果定义了其他构造函数,编译器还是会给你合成一个拷贝构造函数。

 

直接初始化,拷贝初始化

使用直接初始化,我们是在要求编译器使用普通的函数匹配,来选择与我们提供的参数最匹配的构造函数

使用拷贝初始化,要求编译器将右侧运算符对象拷贝到正在创建的对象中(需要的话还进行类型转换)

 

拷贝赋值运算符

赋值运算符本质也是函数,它由operator关键字后面接要定义的运算符的符号组成,赋值运算符就是一个名为operator=的函数,

和其他函数一样,它也有一个返回类型和一个参数列表。

 

 

合成拷贝赋值运算符(默认)

和拷贝构造函数一样,如果一个类未定义自己的拷贝赋值运算符,编译器会生成一个合成拷贝赋值运算符,

编译器会生成一个合成拷贝赋值运算符,类似拷贝构造函数,对于某些类,合成拷贝赋值运算符用来禁止该类型对象的赋值。

拷贝赋值运算符会将右侧运算对象的每个非static成员赋予左侧运算对象的对应成员,对于数组类型的成员,

逐个赋值数组元素合成拷贝赋值运算符返回一个指向其左侧运算对象的引用。

 

 

 

浅拷贝和深拷贝的区别

1.浅拷贝也叫位拷贝,拷贝的是地址。容易导致野指针

2.深拷贝也叫值拷贝,拷贝的是内容。

如果一个类拥有资源,当这个类的对象发生复制的过程的时候,资源重新分配,这个过程就是深拷贝,反之,没有重新分配资源,就是浅拷贝。

标签:控制,C++,运算符,编译器,默认,拷贝,构造函数,赋值
From: https://www.cnblogs.com/huwy-123/p/18125002

相关文章

  • C++U4新-第06课-二分答案
    二分答案学习目标 先学习单调性,二分查找的单调性意思二分答案单调性 二分答案的思路  [【二分答案】-砍树] #include<iostream>usingnamespacestd;intmain(){intn,m;inttree[1000005];cin>>n>>m;for(inti=1;i<=n;i......
  • C++ - VS2019配置Qt开发环境
    下面正式介绍VS2019+Qt5.14.2开发环境的配置,其它版本类似,安装步骤如下:注意:首先自行安装好vs2019和qt5.14.2再执行以下步骤1、VisualStudio2019配置Qt环境(1)插件下载安装点击VS上方的菜单栏,选择“拓展—>管理拓展”进入管理拓展对话框,在右上方搜索qt,出现搜索结果后,选择......
  • 百度驾驶证C++离线SDK V1.1 C#接入
    百度驾驶证C++离线SDKV1.1C#接入目录说明 效果 项目代码下载 说明 自己根据SDK封装了动态库,然后C#调用。SDK包结构效果 项目代码usingNewtonsoft.Json;usingOpenCvSharp;usingSystem;usingSystem.Collections.Generic;usingSystem.Diagnosti......
  • 【leetcode面试经典150题】26.判断子序列(C++)
    【leetcode面试经典150题】专栏系列将为准备暑期实习生以及秋招的同学们提高在面试时的经典面试算法题的思路和想法。本专栏将以一题多解和精简算法思路为主,题解使用C++语言。(若有使用其他语言的同学也可了解题解思路,本质上语法内容一致)【题目描述】给定字符串 s 和 t ......
  • 第十一届蓝桥杯C/C++组C组决赛之思维风暴 快速解题
    十五届蓝桥杯即将开赛,十一届的蓝桥杯国赛的一些巧妙解法。美丽的2 题目描述本题为填空题,只需要算出结果后,在代码中使用输出语包将所填结果输出即可。小蓝特别喜欢2,今年是公元2020年,他特别高兴。他很好奇,在公元1年到公元2020年(包含)中,有多少个年份的数位中包含数字2?......
  • c++中的缺省参数
    c++相对于C语言的一个新的语法叫做缺省参数。什么叫做缺省参数呢???我们先来看我们已知的Add函数缺省参数就是给x和y赋一个默认的值  我们可以根据自己的需要将x或者y给上缺省值看下面一个例子: 如果我们将函数中所有的参数都给上了缺省值,我们也叫这些参数为全缺省参数......
  • C++11:超进化--lambda表达式
    目录一、lambda表达式的引入二、lambda表达式的语法2.1lambda表达式各部分说明2.2lambda函数的初步使用2.3详谈捕捉列表2.3.1[var][&var] 2.3.2[=]传值捕捉当前域所有对象 2.3.3[&]传引用捕捉所有对象2.3.4[&,val]混合捕捉​编辑 三、lambda底层、lambda与函数对......
  • 问题解决 usr/include/c++/11/bits/list.tcc:344:24: error: no match for ‘operator
    1.问题解决usr/include/c++/11/bits/list.tcc:344:24:error:nomatchfor‘operator==’错误解释:这个编译错误表明编译器在尝试使用==操作符比较两个对象时找不到匹配的操作符函数。在C++中,如果你尝试比较两个自定义类型的对象,且没有为这些对象定义==操作符,编译器将无法进......
  • C++ 标准模板库 STL(1)set 与 multiset
    一、简介    set与multiset容器能够快速查找键,键是存储在一维容器中的值,二者的区别在于前者不能够存储重复的键值,后者能够存储重复键值。    set与multiset内部结构类似于二叉树,并且被插入到set与multiset容器中的元素会默认进行排序,从而提高查找速度。这意......
  • 突破编程_C++_网络编程(Windows 套接字(setsockopt 选项设置))
    1setsockopt函数介绍Windows套接字(Winsock)的setsockopt函数是用于设置套接字选项的重要工具。通过这个函数,开发者可以调整套接字的行为,以满足特定的网络应用需求。(1)函数原型intsetsockopt(SOCKETs,intlevel,intoptname,constchar*optval,intop......