从effective C++中窥探C++11特性
这几天在看effective C++3rd,这本书算是比较经典的一本入门C++的书了。虽然年代比较久远书中讲的好多模式已经被的新特性取代了,但是从这些旧的模式中可以了解到一些C++新特性设计的初衷,也算是窥探到了C++发展的一角吧。
所以在此记录一下学习过程中那些被C++11新特性取代的旧模式吧(C++11后面的特性我还不是很了解,以后学到了再补充吧)
1、阻止编译器自动生成函数
编译器在一些情况下会为自定义类自动生成默认构造函数、拷贝构造函数和运算符,移动构造函数和运算符(C++11新特性)。但是有些自定义类不希望用户进行一些操作,就应该在设计时就考虑到这种情况。
比如:一个类Uncopyable是一个机密信息,不允许被拷贝,所以没有在类中设计拷贝控制函数。但是如果恰好写了赋值操作,则编译器会自动生成一个拷贝赋值运算符,下面代码是运行正确的,这显然与设计初衷不符。
class Uncopable;
Uncopable uncopy,user;
user=uncopy;
为了避免这种情况的发生,我们应该阻止编译器自动生成某些函数。
旧设计模式:将目标函数声明为private并且不定义
C++11新特性:将函数定义为delete,定义为delete的函数编译器不会自动为其合成相关函数并且也不允许进行相关操作。
2、阻止类被继承
派生类继承自一个带有非虚析构函数的类可能导致在销毁派生类对象时的内存泄漏,因为派生类对象销毁时可能没有销毁继承自基类的子成员。并且有一些类设计之初就不打算作为基类让其他类继承,如果这些类被继承的话会导致上述的内存泄漏。例如下列代码会导致A的对象没有被完全释放。
1 struct A{ //未考虑继承
2 A() :x(new int) { cout << "c x" << endl; }
3 ~A() { delete x;
4 cout << "d x" << endl;
5 }
6 private:
7 int* x;
8 };
9 struct B :A
10 {
11 B() :A(), y(new double) { cout << "c y" << endl; }
12 ~B() { delete y;
13 cout << "d y" << endl;
14 }
15 private:
16 double* y;
17 };
18
19
20 int main()
21 {
22 B *b = new B;
23 A *a;
24 a=b;
25 delete a; //内存泄漏
26 return 0;
27 }
输出结果:
c x
c y
d x
上述代码因为类A不含虚函数所以没有多态特性,所以删除指针a时只调用A的析构函数,销毁了A的成员x,B的成员y没有销毁导致内存泄漏。
如果即使不考虑继承但是也将析构函数设为virtual,则会增加类对象的体积并且使其具有不可移植性(会建立虚函数表,此部分看effective C++3rd 条款7)。旧的C++似乎无法阻止这种情况的发生,但是C++11弥补了这项缺陷。
C++11新特性:将类设为final,设为final的类不予许作为基类。
从effective C++中窥探C++11特性的更多相关文章
- 【Qt开发】Qt5 中对 C++11 一些新特性的封装
C++11 是现在的 C++ 标准的名称,C++11 为 C++ 语言带来很多新特性. 而 Qt 4.8 是 Qt 首个在其 API 中开始使用一些新的 C++11 特性的版本,我之前写过一篇博文:C ...
- C++11特性——变量部分(using类型别名、constexpr常量表达式、auto类型推断、nullptr空指针等)
#include <iostream> using namespace std; int main() { using cullptr = const unsigned long long ...
- C++开发者都应该使用的10个C++11特性
转载自http://blog.jobbole.com/44015/ 在C++11新标准中,语言本身和标准库都增加了很多新内容,本文只涉及了一些皮毛.不过我相信这些新特性当中有一些,应该成为所有C++开 ...
- 从Profile中窥探Unity的内存管理
刨根问底U3D---从Profile中窥探Unity的内存管理 这篇文章包含哪些内容 这篇文章从Unity的Profile组件入手,来探讨一下Unity在开发环境和正式环境中的内存使用发面的一些区别, ...
- 转载:每个C++开发者都应该使用的十个C++11特性
这篇文章讨论了一系列所有开发者都应该学习和使用的C++11特性,在新的C++标准中,语言和标准库都加入了很多新属性,这篇文章只会介绍一些皮毛,然而,我相信有一些特征用法应该会成为C++开发者的日常用法 ...
- C++开发者都应该使用的10个C++11特性 转
http://blog.jobbole.com/44015/// | 分类: C/C++, 开发 | 条评论 | 标签: C++, C语言 分享到: 本文由 伯乐在线 - 治不好你我就不是兽医 翻译自 ...
- 9.翻译系列:EF 6以及EF Core中的数据注解特性(EF 6 Code-First系列)
原文地址:http://www.entityframeworktutorial.net/code-first/dataannotation-in-code-first.aspx EF 6 Code-F ...
- 目前主流编译器对C++11特性的支持情况
目前主流编译器对C++11特性的支持情况 1. GCC编译器(从编译器GCC4.8.X的版本完全支持) (1)目前C++11特性,之前成为C++0X特性,从GCC4.3的后续版本中逐步对C++11进行 ...
- 开发者都应该使用的10个C++11特性
摘要: 在C++11新标准中,语言本身和标准库都增加了很多新内容,本文只涉及了一些皮毛.不过我相信这些新特性当中有一些,应该成为所有C++开发者的常规装备.你也许看到过许多类似介绍各种C++11特性的 ...
随机推荐
- P1149_火柴棒等式(JAVA语言)
题目描述 给你n根火柴棍,你可以拼出多少个形如"A+B=C"的等式?等式中的A.B.C是用火柴棍拼出的整数(若该数非零,则最高位不能是0).用火柴棍拼数字0-90−9的拼法如图所示 ...
- 了解PSexec
PSExec允许用户连接到远程计算机并通过命名管道执行命令.命名管道是通过一个随机命名的二进制文件建立的,该文件被写入远程计算机上的ADMIN $共享,并被SVCManager用来创建新服务. 您可以 ...
- java进阶(40)--wait与notify(生产者与消费者模式)
文档目录: 一.概念 二.wait的作用 三.notify的作用 四.生产者消费者模式 五.举例 ---------------------------------------分割线:正文------ ...
- 数据表设计之主键自增、UUID或联合主键
最近在做数据库设计的时候(以MySQL为主),遇到不少困惑,因为之前做数据库表设计,基本上主键都是使用自增的形式,最近因为这种做法,被领导指出存在一些不足,于是我想搞明白哪里不足. 一.MySQL为什 ...
- 第一个真正的 GUI 程序——Tkinter教程系列02
第一个真正的 GUI 程序--Tkinter教程系列02 前言 欢迎光临我的个人博客 chens.life Tk 系列教程: Tkinter教程系列01--引言和安装Tk 我们将编写一个英尺和米的转换 ...
- ubuntu20.04开机显示recovering journal死机的解决方法
事发突然,在今天开机的时候无法进入登陆界面,一直卡在黑屏界面,屏幕上只显示几行代码,且任何按键都无法起作用 /dev/sdb2:recovering journal /dev/sdb2:Clearin ...
- 【Django学习笔记】-环境搭建
对于初学django新手,根据以下步骤可以快速进行Django环境搭建 虚拟环境创建 使用virtualenv创建并启用虚拟机环境 ,关于virtualenv可参考https://www.yuque. ...
- CIE标准色度系统(下)
四.色温与相关色温 根据绝对黑体光谱分布特性的普朗克定律,由普朗克公式可以计算出黑体对应于某一温度的光谱分布,并由此应用CIE标准色度系统可获得该温度下黑体发光的三刺激值和色品坐标,从而在色品图上得到 ...
- 【macOS】屏蔽Big Sur更新提示 消除更新红点
下面介绍如何屏蔽macOS系统更新,屏蔽Big Sur更新提示,消除更新红点. 取消自动更新选项 请选取苹果菜单 > "系统偏好设置",然后点按"软件更新&qu ...
- day6.细说类型2
一.字符串(一)字符串需要掌握的操作1.# strip (清除):序列是一段字符串,该函数表示从头和从尾部同时开始进行扫描,如果扫描的字符在序列字符串中,则剔除掉,一直到遇到一个不在序列字符串中的字符 ...