C++中的拷贝构造函数
一、拷贝构造函数:
格式: A(const A& a);
总结:
系统为对象B分配了内存并完成了与对象testA的复制过程,就类对象而言,相同类型的类对象是通过拷贝构造函数来完成整个复制过程的。
1.拷贝构造函数的使用:
A testA;
A B = testA;
2.析构的先后顺序:
程序结束,析构的时候,先析构了B,后析构了testA.
二、拷贝构造函数的调用时机
1、当函数的参数为类的对象时;
调用copy_constructor_fun(A aA)时,会产生以下几个重要步骤:
(1)、A对象传入形参时,会先产生一个临时变量Temp;
(2)、然后调用拷贝构造函数把A的值给Temp。
(3)、等copy_constructor_fun()指向完毕后,析构掉Temp。
2、函数的返回值是类的对象
3、对象需要另外一个对象进行初始化
A testA(100);
A B = testA;
或者:
A C(testA);
三、深拷贝和浅拷贝
1、默认拷贝构造函数
2、浅拷贝
简单的值复制,比如上面几个例子,都是浅拷贝,默认的拷贝构造函数都是浅拷贝。
3、深拷贝
深拷贝主要用于类中有指针成员变量时,防止析构的时候指针悬挂现象。
因为默认的拷贝构造函数只是简单的值复制,如果存在指针变量,相当于两个指针指向同一块内存地址,析构的时候,该块内存地址会被析构两遍,那么当第一次被释放之后,后面指向该内存的指针就会存在悬挂的现象。
深拷贝主要是为拷贝的类对象中的指针变量开辟新的内存空间,这样释放的时候,就不会出现悬挂现象。
写明显示的深拷贝构造函数:
四、总结
1.为什么拷贝构造函数的参数必须是引用传递,而不是值传递
防止递归调用。
2、拷贝构造函数的作用
用来复制对象的,使用以一个对象的实例来初始化这个对象的一个新的实例。
3、对一个类A,如果一个构造函数的第一个参数是下列之一:
1) A&
2) const A&
3) volatile A&
4) const volatile A&
且没有其他参数或者其他参数都有默认值,那么这个函数是拷贝构造函数。
4、一个类中可以存在多余一个的拷贝构造函数吗?
答: 类中可以存在超过一个拷贝构造函数。
注意,如果一个类中只存在一个参数为 X& 的拷贝构造函数,那么就不能使用const X或volatile X的对象实行拷贝初始化.
如果一个类中没有定义拷贝构造函数,那么编译器会自动产生一个默认的拷贝构造函数。
这个默认的参数可能为 X::X(const X&)或 X::X(X&),由编译器根据上下文决定选择哪一个。
5、构造函数可以重载,析构函数不可以重载。
6、禁止拷贝,禁止赋值操作符
将拷贝构造函数和赋值操作符声明为private即可。
C++中的拷贝构造函数的更多相关文章
- 关于C++中的拷贝构造函数和赋值函数
如果类定义的数据成员中存在指针或引用,那么最好重载这两个函数. 1. 定义 拷贝构造函数的定义格式:构造函数名(const 源类名& 引用对象形参名){} 赋值函数定义格式:源类名 & ...
- C/C++中的拷贝构造函数和赋值构造函数
代码: #include <iostream> #include <cstdio> using namespace std; class A{ public: A(){ cou ...
- C++:构造函数2——拷贝构造函数
前言:拷贝构造函数是C++中的重点之一,在这里对其知识进行一个简单的总结. 一.什么是拷贝构造函数 在C++中,对于内置类型的变量来说,在其创建的过程中用同类型的另一个变量来初始化它是完全可以的,如 ...
- C++中的构造函数,拷贝构造函数和赋值运算
关于C++中的构造函数,拷贝构造函数和赋值运算,以前看过一篇<高质量C++/C编程指南>的文章中介绍的很清楚,网上能搜索到,如果想详细了解这方面的知识可以参看一下这篇文章. 常见的给对象赋 ...
- C++中构造函数,拷贝构造函数和赋值函数的区别和实现
C++中一般创建对象,拷贝或赋值的方式有构造函数,拷贝构造函数,赋值函数这三种方法.下面就详细比较下三者之间的区别以及它们的具体实现 1.构造函数 构造函数是一种特殊的类成员函数,是当创建一个类的对象 ...
- C++中的构造函数,拷贝构造函数,赋值函数
C++中一般创建对象,拷贝或赋值的方式有构造函数,拷贝构造函数,赋值函数这三种方法.下面就详细比较下三者之间的区别以及它们的具体实现 1.构造函数 构造函数是一种特殊的类成员函数,是当创建一个类的对象 ...
- C++中拷贝构造函数
C++中拷贝构造函数 1.什么是拷贝构造函数: 拷贝构造函数嘛,当然就是拷贝和构造了.(其实很多名字,只要静下心来想一想,就真的是顾名思义呀)拷贝又称复制,因此拷贝构造函数又称复制构造函数.百度百科上 ...
- c++中拷贝构造函数,浅拷贝和深拷贝的区别
在C++提供了一种特殊的构造函数,称为拷贝构造函数.拷贝构造函数具有一般构造函数的所有特性,其作用是使用一个已经存在的对象(由拷贝构造函数的参数指定的对象)去初始化一个新的同类对象,即完成本类对象的复 ...
- 理解C++中拷贝构造函数
拷贝构造函数的功能是用一个已有的对象来初始化一个被创建的同样对象,是一种特殊的构造函数,具有一般构造函数的所有特性,当创建一个新对象的时候系统会自动调用它:其形参是本类对象的引用,它的特殊功能是将参数 ...
随机推荐
- 计算机网络,HTTP - 如何查看一个网站是否使用HTTP/2?
方法 HTTP/2用":authority"头部代替"Host"头部. Chrome F12里面,HTTP/1.1有"view source" ...
- C++-POJ1020-Anniversary Cake[搜索][dfs]
#include <set> #include <map> #include <cmath> #include <queue> #include < ...
- windows7安装 npm和cnpm
1.node.js下载地址: https://nodejs.org/en/download/ 我选择的安装路径是D:\files\nodejs 2.查看安装是否成功 3.创建文件夹 在D:\files ...
- 转载:Bass management
https://kenrockwell.com/audio/bass-management.htm https://www.axiomaudio.com/blog/bassmanagement htt ...
- windows系统下,gpu开发环境部署
1,安装python,使用anaconda或者直接用python.exe安装都可以.我用的是python3.6版的 对于相关的程序包,比如tensorflow或者opencv等,anaconda可以在 ...
- C++继承、多态与虚表
继承 继承的一般形式 子类继承父类,是全盘继承,将父类所有的东西都继承给子类,除了父类的生死,就是父类的构造和析构是不能继承的. 继承的访问权限从两方面看: 1.对象:对象只能直接访问类中公有方法和成 ...
- ubuntu刪除軟件
1.打开一个终端,输入dpkg --list ,按下Enter键,终端输出以下内容,显示的是你电脑上安装的所有软件2.在终端中找到你需要卸载的软件的名称,列表是按照首字母排序的.3.在终端上输入命令s ...
- code ELIFECYCLE 报错处理
npm ERR! code ELIFECYCLEnpm ERR! errno 1npm ERR! m-kbs-vip@1.2.12 toserver: `tua -p toserver`npm ERR ...
- 第二十八篇 玩转数据结构——堆(Heap)和有优先队列(Priority Queue)
1.. 优先队列(Priority Queue) 优先队列与普通队列的区别:普通队列遵循先进先出的原则:优先队列的出队顺序与入队顺序无关,与优先级相关. 优先队列可以使用队列的接口,只是在 ...
- 计算几何-Line-Left-Intersect
This article is made by Jason-Cow.Welcome to reprint.But please post the article's address. 好好领悟一下ve ...