构造,析构 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构造函数. 但是只有当这些 ...
随机推荐
- jsp不解析el表达式,不识别jstl标签,找不到http://java.sun.com/jsp/jstl/core
问题描述: jsp页面中el表达式,例如:${pageContext.request.contextPath},原样呈现,未被解析. 解决方案: 为jsp页添加page指令如下: <%@ pag ...
- table布局与div布局
DIV与TABLE本身并不存在什么优缺点,所谓web标准只是推荐的是正确的使用标签,好比说:DIV用于布局,而TABLE则本来就是转二维数据的.让TABLE做该做的事,并不是说页面里不出现TABL ...
- TWebBrowser禁止弹出Alert对话框
以前介绍过通过编写Webbrowser1的OnDocumentComplete事件响应代码可以拦截网页弹出的Alert等对话框,代码如下: procedure TForm1.WebBrowser1Do ...
- Tesseract-OCR4.0版本在VS2015上的编译与运行(转)
最近刚开始接触识别库引擎方面的知识,由于项目中需要使用光学识别处理模块,在老师与朋友的推荐下,我开始接触tesseract光学识别库,在最开始从GitHub上下载的源代码进行编译的时候,出现了许多意想 ...
- Eclipse实用操作
1.缩进:Tab 2.退格:Shift+Tab 3.包结构展开方式:Package Presentation 4.快速定位文件:按ctrl键不放,鼠标移至链接处 5.为属性快速生成相应的get和set ...
- GPS坐标转换 百度地图API调用
1 如果GPS输出的值是DD.DDDDDDDD格式的,直接调用地图API的转换函数处理,就可以正常显示2 如果GPS输出的值是DD.MMMMMMMM格式的,就需要先进行分转度处理,然后再调API,就可 ...
- Delphi XE3通过ADOConnection 连接 MySQL 5.5.27 数据库
Delphi XE3通过ADOConnection 连接 MySQL 5.5.27 数据库 unit Unit1; interface uses Winapi.Windows, Winapi.Mess ...
- 吴裕雄 python深度学习与实践(4)
import numpy,math def softmax(inMatrix): m,n = numpy.shape(inMatrix) outMatrix = numpy.mat(numpy.zer ...
- centos 下安装redis
一.安装redis 第一步:下载redis安装包 redis下载地址 wget http://download.redis.io/releases/redis-5.0.3.tar.gz 第二步:解压压 ...
- Cascade Classifier Training 没有基础也会目标检测啦
Cascade Classifier Training 具体自己看: http://docs.opencv.org/2.4.13.2/doc/user_guide/ug_traincascade.ht ...