构造,析构 cpp
一 构造析构常识:
1,c++ 处理类,若没有声明,则编译器默认声明构造,拷贝赋值,拷贝构造,析构函数。所有这些函数都是public且inline的。
2,编译器产出的析构函数是非虚函数。(non-virtual)。
3,拷贝构造和拷贝赋值函数作用就是拷贝非静态成员变量到目标对象处。
4,如果打算在内部含有引用成员的类内支持赋值操作,必须自己定义拷贝赋值函数。operator =
5,若不想使用默认函数,最好在编程时候明确拒绝。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
因为有时候我们不想使函数为public。但是编译器产生的函数都是public的。
有时候我们为了不让别人调用我们的函数,回声明为私有,但是这种函数还是会被友元和内部函数调用,因此,一般的处理方式是声明成私有,且不实现它,并通过私有继承该BASE类,完成操作(不允许调用该函数的操作)。
上述5是为了有效驳回编译器提供的默认函数:
class A{
protect:
A(){};
~A(){};
private:
A(const A& );
A& operator=(const A&);
}
class B:private A{
}
::::::::::::
二 为多态基类声明虚析构
原因是:一般我们经常用基类指针指向派生类对象进行操作,当我们声明的base类没有virtual析构函数时候,派生类对象经由基类指针删除会造成未定义结果。
实际经常出现对象派生成分没有被销毁,基类成分通常是被销毁了的。这就造成一个局部销毁的现象。形成资源泄露。
解决这个问题的方法是给基类声明虚析构函数。(虚函数一般是为了实现多态而不实现的)
(任何类只要带有虚函数都应该有一个虚析构,如果一个类没有虚函数,通常表示它并不想作为一个基类来使用)
纯虚函数应用:当我们想要一个基类,抽象类总是被当做一个基类来用的,而基类又应该有一个虚函数,纯虚函数会构成一个抽象类,因此,你想声明的基类抽象类应该具有一个纯虚析构函数。virtual ~FUN()=0;
析构函数运作方式:最深层派生类的析构函数最先被调用。然后是每一层基类的析构函数。由内到外调用析构。
总结:多态性的类应该有虚函数,有虚函数就行该有虚析构,且被作为基类使用。
当你声明的类不想让他作为基类、不想他具有多态性,就不应该有虚函数或虚析构。
三 别让异常逃离析构函数
首先,c++出现两个或更多同时存在的异常的时候,会导致程序结束或者不明确行为。
注意:构造和析构都可以写异常,但是一般我们不建议。。
注意:析构函数绝对不要吐出异常,会导致内存泄漏,如果被析构函数调用的函数可能抛出异常,析构函数应该具备捕获任何异常的能力。然后吞下他们,或者结束程序。
如果客户需要对某时刻某函数运行抛出的异常做出反应,最好提供一个普通函数进行异常处理。
这里异常抛出点以后的程序是不执行的,若异常未被处理,则一直向外层抛出,知道被处理,或者程序结束了(没有能处理该异常)。当异常被捕获,并处理,则该捕获层之外的代码,还是可以被执行的,但是异常抛出点后边剩余的代码是不会被执行了,除非你处理完异常之后进行goto跳回。
构造,析构 cpp的更多相关文章
- HexoC++第04课 构造析构.md
C++第04课 构造析构.mdhtml {overflow-x: initial !important;}#write, body { height: auto; } #write, #write h ...
- C++ map.insert 传参类型不同,构造/析构次数不同
1. 传参方式 使用 insert 为 map 插值时,insert 的传参包含以下几种可能: make_pair 生成对象 pair(key_type, value_type) 生成对象 pair( ...
- EffectiveC++ 第2章 构造/析构/赋值运算
我根据自己的理解,对原文的精华部分进行了提炼,并在一些难以理解的地方加上了自己的"可能比较准确"的「翻译」. Chapter 2 构造 / 析构 / 赋值 条款 05:了解C++ ...
- Effective C++ —— 构造/析构/赋值运算(二)
条款05 : 了解C++默默编写并调用哪些函数 编译器可以暗自为class创建default构造函数.copy构造函数.copy assignment操作符,以及析构函数. 1. default构造函 ...
- 《Effective C++》第2章 构造/析构/赋值运算(2)-读书笔记
章节回顾: <Effective C++>第1章 让自己习惯C++-读书笔记 <Effective C++>第2章 构造/析构/赋值运算(1)-读书笔记 <Effecti ...
- 《Effective C++》第2章 构造/析构/赋值运算(1)-读书笔记
章节回顾: <Effective C++>第1章 让自己习惯C++-读书笔记 <Effective C++>第2章 构造/析构/赋值运算(1)-读书笔记 <Effecti ...
- c++继承构造析构调用原则以及特殊变量处理
一.继承中的构造析构调用原则 1.子类对象在创建时会首先调用父类的构造函数 2.父类构造函数执行结束后,执行子类构造函数 3.当父类构造函数有参数时,需要在子类的初始化列表中显示调用: 4.析构函数调 ...
- C++ 类、构造析构、深拷贝
1st,感性理解类的思想,就是把数据和对数据的操作打包在一块儿,设计类的时候要 想好数据部分和 要进行的操作.以下是时间类的示意,时间包含时分秒,Time为构造函数,该类支持的操作就是设置时间和读取时 ...
- 《Effective C++》读书笔记 被你忽略的关于构造析构赋值
如果程序员没有定义,那么编译器会默认隐式为你创建一个copy构造函数,一个copy赋值操作符,一个析构函数.另外如果你没有声明任何构造函数,编译器会为你声明一个default构造函数. 但是只有当这些 ...
随机推荐
- 机器学习进阶-案例实战-图像全景拼接-图像全景拼接(RANSCA) 1.sift.detectAndComputer(获得sift图像关键点) 2.cv2.findHomography(计算单应性矩阵H) 3.cv2.warpPerspective(获得单应性变化后的图像) 4.cv2.line(对关键点位置进行连线画图)
1. sift.detectAndComputer(gray, None) # 计算出图像的关键点和sift特征向量 参数说明:gray表示输入的图片 2.cv2.findHomography(kp ...
- mongodb学习-练习实例
C:\Users\issuser>mongoMongoDB shell version: 2.4.6connecting to: test> db.user.find(){ "_ ...
- Bootstarp 模版网站
最佳Bootstrap模版 https://colorlib.com/wp/cat/bootstrap/ https://www.jianshu.com/p/4a116cf24a05
- 爬虫--scrapy+redis分布式爬取58同城北京全站租房数据
作业需求: 1.基于Spider或者CrawlSpider进行租房信息的爬取 2.本机搭建分布式环境对租房信息进行爬取 3.搭建多台机器的分布式环境,多台机器同时进行租房数据爬取 建议:用Pychar ...
- cx_Oracle.DatabaseError: DPI-1047
ODPI-C Installation¶ Overview Oracle Client and Database Versions Linux Oracle Instant Client Zip Or ...
- vue:vue引入组建的多种写法
vue的路由组件中,引入模块的两种写法:(@等价于..)死的写法:不是按需加载1:import Index from '@/components/Index'(import Index from '. ...
- git使用——分支
创建dev分支,并切换到dev分支. git checkout -b dev //Switched to a new branch 'dev' 查看分支. git branch //* dev &qu ...
- linux 再多的running也挡不住锁
再续<linux 3.10 一次softlock排查>,看运行态进程数量之多: crash> mach MACHINE TYPE: x86_64 MEMORY SIZE: GB CP ...
- Haskell语言学习笔记(78)fix
fix 函数 fix 是一个在 Data.Function 模块中定义的函数,它是对于递归的封装,可以用于定义不动点函数. fix :: (a -> a) -> a fix f = let ...
- k8s删除一个Node并重新加入集群
k8s删除一个节点使用以下命令 删除一个节点前,先驱赶掉上面的pod kubectl drain 172.17.3.51 --delete-local-data 然后我们来删除节点 kubectl d ...