三、编译器默认提供的类内函数讨论

1、当写下一个空类时,编译器会在必要的时候默认提供四个函数:构造、拷贝构造、operator=和析构函数,而且都是public的

class Empty{ };

上述的Empty相当于下图

2、如果在一个类内仅仅自定义了一个构造函数,那么编译器将不会再提供默认构造函数。但是编译器仍然会提供默认的拷贝构造、operator=和析构函数

3、当类内函数const对象或者引用对象时,编译器不会提供默认的构造函数和operator=

示例

class test
{const int a;
};int main(int argc, char const *argv[])
{test a;test c;c=a;
}

这是因为,编译器默认提供的构造函数不会对const进行初始化,而const变量没法重新赋值,所以默认提供的operator=也没法成功调用(见博客https://blog.csdn.net/Master_Cui/article/details/109461561

示例2

class test
{
public:test():b(10), a(b) {}int b;int &a;
};int main(int argc, char const *argv[])
{test a;test c;c=a;
}

赋值之前,对象a和c中的引用都指向各自对象中的变量。赋值之后,a和c中的引用都绑定了同一个变量,导致原先引用更改绑定的对象,违反引用只能绑定一个对象的规则。所以,面对这种情况,编译器报错

编译器无法生成默认的构造函数的情况见博客https://blog.csdn.net/Master_Cui/article/details/106885137

四、防止类对象拷贝和赋值的两种方式

见博客https://blog.csdn.net/Master_Cui/article/details/109461561

五、将基类的析构函数函数设置为虚函数

见博客https://blog.csdn.net/Master_Cui/article/details/109957302

多态基类的析构函数应该是虚函数。类如果一个类只是普通基类,就不该将析构函数作为虚函数,因为会增加虚指针,代码体积变大。

因为STL中的容器的析构函数并不使虚函数,所以,不要继承STL中的容器

六、关于纯虚析构函数

关于纯虚函数见博客https://blog.csdn.net/Master_Cui/article/details/109957302

如果一个基类有纯虚析构函数,需要对纯虚析构函数至少加个空实现

示例

class base
{
public:base(){cout<<__func__<<endl;}virtual ~base()=0;virtual void func()=0;
};class derive:public base
{
public:derive(){cout<<__func__<<endl;}~derive(){cout<<__func__<<endl;}void func() {cout<<__func__<<endl;}
};int main(int argc, char const *argv[])
{base *bp=new derive();delete bp;
}

上述代码会出现链接错误

因为delete基类指针时,子类对象完成析构操作后,也要调用基类部分的析构函数,所以要在类外,实现一个至少为空的纯虚析构函数

base::~base() {cout<<__func__<<endl;}

七、不要再析构函数和构造函数中调用虚函数

见博客https://blog.csdn.net/Master_Cui/article/details/109957302

参考

《Effective C++》

欢迎大家评论交流,作者水平有限,如有错误,欢迎指出

C++编程进阶2(编译器在类内默认生成的函数讨论以及纯虚析构函数)相关推荐

  1. C++_类和对象_C++多态_虚析构和纯虚析构函数---C++语言工作笔记074

    然后我们再来看,虚析构和纯虚析构函数的用法,上面有大体的介绍了. 但是我们还是用一个例子来说明一下更好. 首先,我们去创建一个Animal类,类中我们去写上一个spreak这个,纯虚函数,然后,让我们 ...

  2. c++ 虚函数多态、纯虚函数、虚函数表指针、虚基类表指针详解

    文章目录 静态多态.动态多态 虚函数 哪些函数类型不可以被定义成虚函数? 虚函数的访问方式 析构函数中的虚函数 虚函数表指针 vptr 多继承下的虚函数表 虚基类表指针 bptr 纯虚函数 抽象类 虚 ...

  3. Cpp 对象模型探索 / 多重继承下基类指针释放子类对象的原理说明(虚析构函数的作用)

    源码 #include <iostream>class Base1 { public:virtual void func_1_1(){ std::cout << "B ...

  4. 类的垂直关系中,如何把握纯虚函数

    下面看看一个跟虚函数相关的几个名词: 抽象类: 含有纯虚函数的类,称作抽象类. 抽象类是不能实例化的,就是不能定义抽象类的对象,但是可以定义抽象类的指针变量. 抽象类往往是对问题领域进行分析和设计以后 ...

  5. C++类与对象笔记十四:多态六:虚析构和纯虚析构

    多态使用时,如果子类中有属性开辟到堆区,那么父类指针在释放时无法调用子类的析构代码. 即:父类指针无法调用子类实例对象内的析构函数.造成堆区内存泄漏. 解决方案:将父类中的析构函数改为虚析构或者纯虚析 ...

  6. C/C++编程:虚函数与纯虚函数

    虚函数 VS 纯虚函数 虚函数 虚函数是应在派生类中重新定义的函数.当使用指针或者对基类的引用来引用派生类的对象时,可以为该对象调用虚函数并执行该派生类的版本. 虚函数的"虚",虚 ...

  7. C++中为什么要引入抽象基类和纯虚函数?

    为什么要引入抽象基类和纯虚函数? 主要目的是为了实现一种接口的效果. 抽象类是一种特殊的类,它是为了抽象和设计的目的为建立的,它处于继承层次结构的较上层. ⑴抽象类的定义:带有纯虚函数的类为抽象类. ...

  8. C++引入抽象基类和纯虚函数的作用和目的

    为什么要引入抽象基类和纯虚函数? 主要目的是为了实现一种接口的效果. 原文链接:https://blog.csdn.net/weibo1230123/article/details/82014322 ...

  9. 抽象类(纯虚函数、虚函数)和虚基类(虚继承)

    C++多态 C++的多态包括静态多态和动态多态,静态多态包括函数重载和泛型编程,动态多态包括虚函数.静态多态实在编译期间就能确定,动态多态实直在程序运行时才能确定. 抽象类 虚函数 在默认情况下对函数 ...

最新文章

  1. javascript本地缓存方案-- 存储对象和设置过期时间
  2. 损失函数梯度对比-均方差和交叉熵
  3. PostgreSQL数据库远程连接功能的开启
  4. BZOJ-1922 大陆争霸 多限制、分层图最短路 (堆+dijkstra)
  5. Java怎么用继承回复信息_JAVA面向对象-继承
  6. iZotope Ozone 9 Advanced for Mac(臭氧9高级版)
  7. matlab 振动,Matlab振动程序-代码作业
  8. 图片溢出div,超出div解决办法
  9. 【WebDriver】WebDriverWait 用法代码
  10. cocoscreator热更新
  11. 武汉交通职业学院计算机协会,2018年中国计算机学会(CCF)职业教育大会在苏州顺利落幕...
  12. elastic job (一) elastic-job-lite----SimpleJob
  13. C语言小游戏->井字棋
  14. 艾永亮:服装业的投机主义,满足的到底是谁的需求?
  15. 编译安装 Python
  16. CDH框架搭建【小白易上手】
  17. AT89C52RC定时器T2
  18. 迅雷5.5.4.268去广告版
  19. 协作工具 Trello
  20. Paxos算法与Fischer-Lynch-Paterson结论

热门文章

  1. qml基础学习 基础概念
  2. SharePoint Adventures : Using Claims with Reporting Services
  3. 4.9.3 方法注释
  4. 关于无法显示-隐藏文件、文件夹以及操作系统文件夹
  5. 我的2008年(上)-《走出软件作坊》是怎样炼成的
  6. 【特征匹配】BRISK原文内容翻译
  7. pd.get_dummies
  8. sharepoint开机启动禁止
  9. 21个让React 开发更高效更有趣的工具
  10. Java复习二 基本数据类型与变量和常量