构造,析构 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构造函数. 但是只有当这些 ...
随机推荐
- hdoj 1004 学习思路
hdoj 1004题目大概讲的是,将输入的字符串根据输入次数多少,输出出现次数最多的字符串. 题目逻辑很简单,就是需要选择相应的数据结构,看了别人提交的discuss,明显发现可以使用多种数据结构解这 ...
- Spark、Hadoop、Hive相关文章
1.Spark On Yarn(HDFS HA)详细配置过程 2.Hive安装与配置详解
- 静态函数造成GC的原因
有时候用deep profiling查看GC时会发现:一个父函数有GC,展开子层级看到一个很奇怪的 CX::ctor,表示CX进行了构造,然后打开父函数代码却完全看不到有new CX的地方,这个时候可 ...
- Windows下查看端口常用命令以及关闭端口的方法
1.C:\Users\JavaKam> netstat -ano|findstr 1099 TCP LISTENING TCP [::]: [::]: LISTENING 2.出现: C:\Us ...
- python第三步骤(pygame)
1:先安装homebrew(类似于yum /apt-get为什么需要它呢,因为pip安装的时候需要很多的包的依赖,sdl什么的), 2:pip 安装pygame 我讨厌的环境变量问题 然后 通过的是 ...
- ubuntu 下安装和启动SSH 服务
安装OPENSSH 服务端 sudo apt-get install openssh-server 查看进程是否启动 ps -e | grep ssh 删除密钥文件 rm /etc/ssh/ssh_h ...
- python脚本
python源码编译 python -O -m py_compile file.py [root@localhost python]# cat dbass.py #!/usr/local/bin/py ...
- python 引用和对象理解(转)
引用和对象分离 从最开始的变量开始思考: 在python中,如果要使用一个变量,不需要提前进行声明,只需要在用的时候,给这个变量赋值即可 (这个和C语言等静态类型语言不同,和python为动态类型有关 ...
- Linux初学时的一些常用命令(1)
查看帮助: man 命令 退出帮助目录: q 切换目录:cd cd 目录 cd 目录/目录 cd .. :上一级目录 cd / :根目录cd ~ :回家 创建目录和删除目录 mkdi ...
- js 乘法 4.39*100 出现值不对问题解决
https://www.jianshu.com/p/a026245661bb //除法函数,用来得到精确的除法结果 //说明:javascript的除法结果会有误差,在两个浮点数相除的时候会比较明显. ...