C++编程进阶2(编译器在类内默认生成的函数讨论以及纯虚析构函数)
三、编译器默认提供的类内函数讨论
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(编译器在类内默认生成的函数讨论以及纯虚析构函数)相关推荐
- C++_类和对象_C++多态_虚析构和纯虚析构函数---C++语言工作笔记074
然后我们再来看,虚析构和纯虚析构函数的用法,上面有大体的介绍了. 但是我们还是用一个例子来说明一下更好. 首先,我们去创建一个Animal类,类中我们去写上一个spreak这个,纯虚函数,然后,让我们 ...
- c++ 虚函数多态、纯虚函数、虚函数表指针、虚基类表指针详解
文章目录 静态多态.动态多态 虚函数 哪些函数类型不可以被定义成虚函数? 虚函数的访问方式 析构函数中的虚函数 虚函数表指针 vptr 多继承下的虚函数表 虚基类表指针 bptr 纯虚函数 抽象类 虚 ...
- Cpp 对象模型探索 / 多重继承下基类指针释放子类对象的原理说明(虚析构函数的作用)
源码 #include <iostream>class Base1 { public:virtual void func_1_1(){ std::cout << "B ...
- 类的垂直关系中,如何把握纯虚函数
下面看看一个跟虚函数相关的几个名词: 抽象类: 含有纯虚函数的类,称作抽象类. 抽象类是不能实例化的,就是不能定义抽象类的对象,但是可以定义抽象类的指针变量. 抽象类往往是对问题领域进行分析和设计以后 ...
- C++类与对象笔记十四:多态六:虚析构和纯虚析构
多态使用时,如果子类中有属性开辟到堆区,那么父类指针在释放时无法调用子类的析构代码. 即:父类指针无法调用子类实例对象内的析构函数.造成堆区内存泄漏. 解决方案:将父类中的析构函数改为虚析构或者纯虚析 ...
- C/C++编程:虚函数与纯虚函数
虚函数 VS 纯虚函数 虚函数 虚函数是应在派生类中重新定义的函数.当使用指针或者对基类的引用来引用派生类的对象时,可以为该对象调用虚函数并执行该派生类的版本. 虚函数的"虚",虚 ...
- C++中为什么要引入抽象基类和纯虚函数?
为什么要引入抽象基类和纯虚函数? 主要目的是为了实现一种接口的效果. 抽象类是一种特殊的类,它是为了抽象和设计的目的为建立的,它处于继承层次结构的较上层. ⑴抽象类的定义:带有纯虚函数的类为抽象类. ...
- C++引入抽象基类和纯虚函数的作用和目的
为什么要引入抽象基类和纯虚函数? 主要目的是为了实现一种接口的效果. 原文链接:https://blog.csdn.net/weibo1230123/article/details/82014322 ...
- 抽象类(纯虚函数、虚函数)和虚基类(虚继承)
C++多态 C++的多态包括静态多态和动态多态,静态多态包括函数重载和泛型编程,动态多态包括虚函数.静态多态实在编译期间就能确定,动态多态实直在程序运行时才能确定. 抽象类 虚函数 在默认情况下对函数 ...
最新文章
- javascript本地缓存方案-- 存储对象和设置过期时间
- 损失函数梯度对比-均方差和交叉熵
- PostgreSQL数据库远程连接功能的开启
- BZOJ-1922 大陆争霸 多限制、分层图最短路 (堆+dijkstra)
- Java怎么用继承回复信息_JAVA面向对象-继承
- iZotope Ozone 9 Advanced for Mac(臭氧9高级版)
- matlab 振动,Matlab振动程序-代码作业
- 图片溢出div,超出div解决办法
- 【WebDriver】WebDriverWait 用法代码
- cocoscreator热更新
- 武汉交通职业学院计算机协会,2018年中国计算机学会(CCF)职业教育大会在苏州顺利落幕...
- elastic job (一) elastic-job-lite----SimpleJob
- C语言小游戏->井字棋
- 艾永亮:服装业的投机主义,满足的到底是谁的需求?
- 编译安装 Python
- CDH框架搭建【小白易上手】
- AT89C52RC定时器T2
- 迅雷5.5.4.268去广告版
- 协作工具 Trello
- Paxos算法与Fischer-Lynch-Paterson结论