本文包含以下内容

  1. C++的四类特殊成员函数介绍,重点介绍拷贝构造函数和拷贝复制运算符

  2. C++11中的default/delete特性

本文内容侧重个人理解,深入理解其原理推荐https://www.geeksforgeeks.org

前言

C++ 的类有四类特殊成员函数,分别是:

  • 默认构造函数
  • 析构函数
  • 拷贝构造函数
  • 拷贝赋值运算符

这些类的特殊成员函数负责创建、初始化、销毁,或者拷贝类的对象。如果没有显式地为一个类定义某个特殊成员函数,而又需要用到该特殊成员函数时,则编译器会隐式的为这个类生成一个默认的特殊成员函数。

sample

class Test{private:int _id;public:Test(int a);  // 构造函数Test(const Test& test);  // 拷贝构造函数Test& operator=(const Test& test);  // 拷贝赋值运算符~Test();  // 析构函数
}

1. 构造函数和拷贝构造函数

从名称上也不难理解,构造函数拷贝构造函数都是用于进行类实例初始化的

Test t1(2);  // 调用实参匹配的构造函数
Test t2 = t1;  // 调用拷贝构造函数,用t1对t2进行初始化

以上也正是C++类进行初始化的两种方式。

使用/调用拷贝构造函数的情况

  拷贝构造函数的作用主要是复制对象

  1. 复制对象,并通过函数返回复制后的对象。
  2. 一个对象以值传递的方式传入函数,此时必定调用拷贝构造函数,即void Func(Test test){}这类。
  3. 一个对象以另一个对象为例进行初始化,以上Test t2=t1;即是此例。

必须显式定义拷贝构造函数的情况

   对于拷贝来讲,尤其需要注意的即是指针和动态分配的资源,这些很容易造成拷贝变成浅拷贝(指向复制前后的变量指向同一块内存区域)
  因此如果类的成员变量包含指针类型,或者有成员表示在构造函数中分配的其他资源,这两种情况下都必须显式的定义拷贝构造函数。

2. 拷贝赋值运算符

 通过定义拷贝赋值运算符,来实现类实例之间的=拷贝运算。
拷贝赋值运算符的通常形式为 classname& operator=(const classname& a)

拷贝赋值运算符与拷贝构造函数 以下例来观察二者的不同:

Test t2 = t1; // 即上面的例子,调用的是拷贝构造函数,即在创建时进行初始化
Test t3;
t3 = t1;  // 此时调用拷贝赋值运算符,因为并不是在创建类的实例时进行初始化

 可以看出二者之间有很大的共通性,即都是为了进行完整的复制/拷贝而创立的,防止陷入浅拷贝造成内存安全问题。

3. C++11特性之default/delete

 在未显式的定义类的特殊成员函数时,如果被调用,系统会自动隐式的创建该特殊成员函数,且隐式的创建方式比显式的创建方式执行效率高

 只需在函数声明后加上=default;,就可将该函数声明为 defaulted 函数,编译器将为显式声明的 defaulted 函数自动生成函数体,以获得更高的执行效率。

 有些时候,我们需要禁用某些函数(=delete不仅可以禁用类内的特殊成员函数,也可以禁用一般函数),此时就需要在该函数后面增加=delete;,则该函数将变的不可调用,比如不可复制等。

sample

class Test{private:int _id;public:Test() = default; // 定义默认构造函数Test(int a);Test(const Test& test) = delete;  // 禁止使用拷贝构造函数的场景Test& operator=(const Test& test);~Test();
}

c++中delete对象后 调用成员函数_C++类的特殊成员函数及default/delete特性相关推荐

  1. abstract类中不可以有private的成员_C++ 类:声明成员函数与实现

    接上文... 16.3类的成员 2.成员函数 1.构造函数 ... 2.拷贝构造函数 有了类的构造函数我们就可以创建类的实例了,下图中分别使用不同的构造函数一共创建了4个动物的对象,现在程序中就有4个 ...

  2. C++类的成员函数(在类外定义成员函数、inline成员函数)

    类的成员函数(简称类函数)是函数的一种,它的用法和作用和前面介绍过的函数基本上是一样的,它也有返回值和函数类型,它与一般函数的区别只是:它是属于一个类的成员,出现在类体中.它可以被指定为private ...

  3. C++类的成员函数(在类外定义成员函数)

    类的成员函数(简称类函数)是函数的一种,它的用法和作用和前面介绍过的函数基本上是一样的,它也有返回值和函数类型,它与一般函数的区别只是:它是属于一个类的成员,出现在类体中.它可以被指定为private ...

  4. keil lib 只调用自己的函数_C语言学习篇(28)——函数库

    引言 我们在编写代码时,常常会写一个.c源文件和与之对应的.h文件(例如a.c和a.h),并在源文件.c中定义(具体实现)一些函数,在.h文件中声明, 这样我们就可以在其他源文件中包含该头文件,来调用 ...

  5. java中如何使用反射调用方法以及获得类中的属性

    使用反射获取类中的方法: 1):获取方法所在类的字节码对象. 2):获取方法. ------------------------------------------------------------ ...

  6. 友元函数、类的非静态成员函数、静态成员函数的区别

    类中申明的函数相对于类来说有三层意思: 1.有this指针 2.函数在类的作用区域中 3.可以访问类中私有部分 4.可以被继承 非静态成员函数具有1234 静态成员函数具有234 友元函数具有3 静态 ...

  7. getline没有与参数列表匹配的重载函数_C++新增基础功能解析—函数重载功能的使用...

    喜欢的可以收藏转发加关注 "函数重载"指的是可以有多个同名的函数,因此 名称进行了重载.这两个术语指的是同一回事,但我们通常使用函数重载.可以通过函数重载来设计• 系列函数--它们 ...

  8. python存储对象的数组_Python:在2d数组中存储对象并调用其方法

    我正在尝试制作一个象棋应用程序.代码如下:#file containing pieces classes class Piece(object):` name = "piece" ...

  9. java 中对对象的调用

    java程序设计语言对对象采用的不是引用的调用,实际上对象引用进行的是值得传递.(from:核心卷1  page:123)

最新文章

  1. 非结构化信息-》半结构化-》结构化-》关联数据体系-》数据挖掘-》故事化呈现-》决策导向
  2. 使用Gradle第一次构建Web应用
  3. React Native 与 嵌入Android原生与Activity页面互相跳转
  4. python小项目实例流程-公司内项目对接钉钉审批流程(python)
  5. 浅谈DevExpress六:为chart创建动态数据源
  6. 【转】服务器维护工程师悲惨的一个星期
  7. vue-cli 3.0集成sass/scss到vue项目
  8. mysql+e+文件+xls_TP5+PHPexcel导入xls,xlsx文件读取数据
  9. 记录一次线上事故:SparkStreaming 写入 Hive 延迟
  10. pe下bootice修复Linux引导,快启动pe工具之bootice引导修复工具使用教程
  11. html英文改中文语言,英文版win7旗舰版系统改成中文语言图文教程
  12. 学生个人网页设计作品:旅游网页设计与实现——成都旅游网站4个页HTML+CSS web前端网页设计期末课程大作业 学生DW静态网页设计 学生个人网页设计作品
  13. linux ui 布局管理器,第1组UI组件:布局管理器
  14. MySQL数据库系统基础_wuli大世界_新浪博客
  15. 我喜欢两个男人。。。
  16. 知识产权服务代理行业税收政策
  17. python 猴子偷桃问题
  18. 有没有测试牙齿需不需要修正的软件,三分钟教你测试自己的牙齿需不需要矫正!...
  19. 第三方支付如何帮助在线教育打通支付
  20. 2017年美亚杯资格赛 个人赛 writeup

热门文章

  1. Cisco easy *** basic ASA
  2. ESP32移植wolfssl方法
  3. 为什么要进行傅立叶变换?傅立叶变换究竟有何意义?如何用Matlab实现快速傅立叶变换?
  4. 《Deep Learning With Python second edition》英文版读书笔记:第十一章DL for text: NLP、Transformer、Seq2Seq
  5. 《算法竞赛进阶指南》打卡-基本算法-AcWing 95. 费解的开关:位运算、枚举、递推
  6. PAT甲级1062 Talent and Virtue:[C++题解]结构体、哈希表
  7. 宝塔服务器搞成虚拟主机,宝塔面板怎么配置虚拟主机
  8. tcp/ip 协议栈Linux内核源码分析八 路由子系统分析三 路由表
  9. linux epoll监听套接字实例
  10. 开服侠显示服务器已停止,蜘蛛侠:极限(已关服)无法连接服务器是什么原因...