构造,析构 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构造函数. 但是只有当这些 ...
随机推荐
- APP-8-文本语音
1.百度语音合成JS文件 baidu_tts_cors.js /** * 浏览器调用语音合成接口 * @param {Object} param 百度语音合成接口参数 * 请参考 https://ai ...
- 一个docker镜像中的目录删除不了问题
在一个容器中,删除一个目录,失败: bash-4.2# pwd /home/zxcdn/ottcache/tomcat bash-4.2# uname -a Linux 3516b6c97679 -. ...
- ReactiveX 学习笔记(4)过滤数据流
Filtering Observables 本文主题为过滤 Observable 的操作符. 这里的 Observable 实质上是可观察的数据流. RxJava操作符(三)Filtering Deb ...
- React/anu实现弹出层2
这次是使用了一个比较罕见的APIReactDOM.unstable_renderSubtreeIntoContainer,ReactDOM.unstable_renderSubtreeIntoCont ...
- 自定义标签在IE6-8的困境
或许未来前端组件化之路都是自定义标签,但这东西早在20年前,JSTL已在搞了.现在Web Component还只有webkit支持.但一个组件库,还需要一个特殊的标识它们是一块的.不过这个XML已经帮 ...
- 浅谈MySQL事务及隔离级别
目录 1.什么是事务 2.事务的ACID属性 2-1.原子性(Atomicity) 2-2.一致性(Consistency) 2-3.隔离性(Isolation) 2-4.持久性(Durability ...
- jquery 初始化数据 添加html 第一次玩0.0
/** * Created by Eee_xiang on 2018/04/12. * 联动响应事件 */ (function () { $.linkEvent = function (options ...
- Structs复习 通配符
1.jar包 web.xml <?xml version="1.0" encoding="UTF-8"?> <web-app version= ...
- 实现了一下Mp3播放器的功能
实现了一下Mp3播放器的功能 简单的实现了一下Mp3播放器的功能,见面比较的不美好,讲 究看一下就好了. 主要功能: 1.显示文件列表,主要参照了一位前辈的代码,谢咯. 2.可以实现播放开始,暂停. ...
- Anaconda安装及配合pycharm使用
首先到https://www.anaconda.com/download/下载合适的anaconda版本.如Windows 64bit. 下载了直接双击开始下载,一路同意下去,到选择安装的目录.这里选 ...