C++类四个默认函数&深复制&浅复制
学习C++语言的同学都知道,C++中类是有默认的几个函数的,主要是有四个函数:
四个函数
- 默认构造函数:A(void),无参构造函数
- 拷贝(复制)构造函数:A(const A&a)。用一个对象A去为另一个对象赋值。
- 析构函数:~A(void)。释放掉A所占用的空间。
- 赋值函数:A &original = const A&a。使用一个对象a直接为另一个对象赋值。
默认的无参构造函数和析构函数不多讲,大家都很明白,析构函数不用手动调用,是在类生命期结束的时候系统自动调用的,析构函数主要是释放分配的空间的(delete和delete[]有类似之处)。
每个类只有一个赋值函数和一个析构函数,但是构造函数却可以有多个。对于任意的一个类,如果不编写上述四个函数,C++编译器会自动生成上述四个函数。那不仅要问了,既然C++编译器这么智能,为什么我们还要编写这四个函数呢?
因为这些缺省的拷贝构造函数和赋值函数都是采用“值”操作的方式,而不是“位”操作。这会导致什么问题呢?我们可以想一些,如果类中的成员变量使用了堆空间的时候,就会出现操作的是同一个地址的问题,也就是我们所说的深复制和浅复制的问题。
深复制和浅复制
所谓浅复制,就不是对整个对象的按照位的拷贝,而是仅仅拷贝了数值,就像上面所说的,如果这个类对象中有指针类型(堆空间),那么经过拷贝构造后得到的对象和原来的对象所指向的就是同一块内存空间,那这算是拷贝么??
深复制就不一样了,是对整个对象的按照位拷贝,当遇到指针(对空间)类型变量时候,会对整个指针空间拷贝。这样可以得到两个完全不同的对象。
拷贝构造函数和赋值函数
那么还有一个问题就是拷贝构造函数和赋值函数到底有什么区别呢?都是值拷贝,那他俩貌似也就一样吧。拷贝构造函数是在对象被创建时调用的,而赋值函数只能被已经存在了的对象调用。如下式子所示:
String a(“hello”);
String b(“world”);
String c = a; // 调用了拷贝构造函数,最好写成c(a);
c = b; // 调用了赋值函数
总结
当类含有动态生成的数据成员,必须自定义析构函数以释放动态分配的内存,自定义复制构造函数(Copy Structor)和复制赋值操作符(Copy Assignment Operator)实现深复制。
C++类四个默认函数&深复制&浅复制的更多相关文章
- C++(1)C++类四个默认函数---构造函数、析构函数、拷贝函数、赋值函数
C++构造函数和析构函数 默认构造函数指不带参数或者所有参数都有缺省值的构造函数!!! (1)构造函数.析构函数与赋值函数 构造函数.析构函数与赋值函数是每个类最基本的函数.它们太普通以致让人容易麻痹 ...
- 简单理解php深复制浅复制问题
其实接触深复制浅复制是通过学习c++了解到的,比如c++很好用的模板,php是不允许方法模板和类模板 一个简单的例子,如果不是很了解php 的取地址符&,可以去看下官方文档,php的& ...
- C++空类中的默认函数
定义一个空的C++类,例如 class Empty { } 一个空的class在C++编译器处理过后就不再为空,编译器会自动地为我们声明一些member function,一般编译过去就相当于 cla ...
- iOS 深复制&浅复制
1.无论是深复制还是浅复制,被复制的对象类型是不变的.此对象类型具有什么功能就具有什么功能,不会因为自行修改了返回对象的指针类型而改变. 比如: 这里的str和str1的值和指针地址完全一 ...
- java 及 Jquery中的深复制 浅复制
发现问题:最近 遇到由于复制对象之后,改变复制后的新变量,原先被复制的对象居然会跟着变. EX:java中: //holidayConfig.getEnd_time()会随着sTime的改变而改变 s ...
- iOS开发之Copy & MutableCopy及深复制 & 浅复制
1.使用copy或mutableCopy方法可以创建一个对象的副本. copy: (1)需要实现NSCoppying协议 (2)创建的是不可变副本(如NSString.NSArray.NSDictio ...
- C++类指针类型的成员变量的浅复制与深复制
本篇文章旨在阐述C++类的构造,拷贝构造,析构机制,以及指针成员变量指针悬空问题的解决.需要读者有较好的C++基础,熟悉引用,const的相关知识. 引言: 类作为C++语言的一种数据类型,是对C语言 ...
- c++类大四个默认函数-构造函数 析构函数 拷贝构造函数 赋值构造函数
每个类只有一个析构函数和一个赋值函数,但可以有多个构造函数(包含一个拷贝构造函数,其它的称为普通构造函数).对于任意一个类A,如果不编写上述函数,C++编译器将自动为A 产生四个缺省的函数,例如: A ...
- Python深复制浅复制or深拷贝浅拷贝
1. copy.copy 浅拷贝 只拷贝父对象,不会拷贝对象的内部的子对象.(比深拷贝更加节省内存)2. copy.deepcopy 深拷贝 拷贝对象及其子对象 用一个简单的例子说明如下: >& ...
随机推荐
- (工具类)MD5算法|时间格式转换|字符串转数字
package vote.utils; import java.security.MessageDigest; import java.text.SimpleDateFormat; import ja ...
- lintcode-415-有效回文串
415-有效回文串 给定一个字符串,判断其是否为一个回文串.只包含字母和数字,忽略大小写. 注意事项 你是否考虑过,字符串有可能是空字符串?这是面试过程中,面试官常常会问的问题. 在这个题目中,我们将 ...
- 1st 结对编程:简易四则运算
结对编程:简易四则运算 功能:进行简易的四则运算,并根据给出的结果判断正误. 实现:使用java的图形化界面实现. 导入包库 package six; import javax.swing.*; im ...
- Mybatis 点点滴滴
相比 Hibernate ,Mybatis 实在是学习门槛低多了. 1 . 类属性和表字段的自动对应 当向数据库中插入一行数据时,<insert>标签中的占位符#{}中的占位符的值写 mo ...
- Java容器深入浅出之List、ListIterator和ArrayList
List是Collection接口的子接口,表示的是一种有序的.可重复元素的集合. List接口的主要实现类ArrayList和Vector,底层都是维护了一套动态的,可扩展长度的Object[]数组 ...
- C#中的静态常量(const)和动态常量(static和readonly)用法和区别
C#中有两种常量类型,分别为readonly(运行时常量)与const(编译时常量),本文将就这两种类型的不同特性进行比较并说明各自的适用场景.工作原理 readonly为运行时常量,程序运行时进行赋 ...
- ZOJ2290_Game
题目意思是这样的,给定一个数N,第一个可以减去任意一个数(不能为N本身),然后接下来轮流减去一个数字,下一个人减去的数字必须大于0,且不大于2倍上一次被减去的数字. 把N减为0的人获胜. 看完题目后不 ...
- python 序列化 pickle shelve json configparser
1. 什么是序列化 我们把变量从内存中变成可存储或传输的过程称之为序列化. 序列化之后,就可以把序列化后的内容写入磁盘,或者通过网络传输到别的机器上. 反过来,把变量内容从序列化的对象重新读到内存里称 ...
- wireshark系列之wireshark简介
前言:为什么要学wireshark?工欲善其事必先利其器,wireshark是一款工具软件,主要作用是抓取数据封包,可以帮助我们更加直观更加具象的学习各种网路协议(http.TLS.TCP.UDP.I ...
- 小结ospf基本配置的三个参数
实例:<华为路由器学习指南>P712 OSPF基本功能配置示例拓扑结构 配置思路:以E为例子 [E]ospf 100 router-id 5.5.5.5[E-ospf-100]area 1 ...