这几天在看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特性的更多相关文章

  1. 【Qt开发】Qt5 中对 C++11 一些新特性的封装

    C++11 是现在的 C++ 标准的名称,C++11 为 C++ 语言带来很多新特性. 而 Qt 4.8 是 Qt 首个在其 API 中开始使用一些新的 C++11 特性的版本,我之前写过一篇博文:C ...

  2. C++11特性——变量部分(using类型别名、constexpr常量表达式、auto类型推断、nullptr空指针等)

    #include <iostream> using namespace std; int main() { using cullptr = const unsigned long long ...

  3. C++开发者都应该使用的10个C++11特性

    转载自http://blog.jobbole.com/44015/ 在C++11新标准中,语言本身和标准库都增加了很多新内容,本文只涉及了一些皮毛.不过我相信这些新特性当中有一些,应该成为所有C++开 ...

  4. 从Profile中窥探Unity的内存管理

    刨根问底U3D---从Profile中窥探Unity的内存管理 这篇文章包含哪些内容 这篇文章从Unity的Profile组件入手,来探讨一下Unity在开发环境和正式环境中的内存使用发面的一些区别, ...

  5. 转载:每个C++开发者都应该使用的十个C++11特性

    这篇文章讨论了一系列所有开发者都应该学习和使用的C++11特性,在新的C++标准中,语言和标准库都加入了很多新属性,这篇文章只会介绍一些皮毛,然而,我相信有一些特征用法应该会成为C++开发者的日常用法 ...

  6. C++开发者都应该使用的10个C++11特性 转

    http://blog.jobbole.com/44015/// | 分类: C/C++, 开发 | 条评论 | 标签: C++, C语言 分享到: 本文由 伯乐在线 - 治不好你我就不是兽医 翻译自 ...

  7. 9.翻译系列:EF 6以及EF Core中的数据注解特性(EF 6 Code-First系列)

    原文地址:http://www.entityframeworktutorial.net/code-first/dataannotation-in-code-first.aspx EF 6 Code-F ...

  8. 目前主流编译器对C++11特性的支持情况

    目前主流编译器对C++11特性的支持情况 1. GCC编译器(从编译器GCC4.8.X的版本完全支持) (1)目前C++11特性,之前成为C++0X特性,从GCC4.3的后续版本中逐步对C++11进行 ...

  9. 开发者都应该使用的10个C++11特性

    摘要: 在C++11新标准中,语言本身和标准库都增加了很多新内容,本文只涉及了一些皮毛.不过我相信这些新特性当中有一些,应该成为所有C++开发者的常规装备.你也许看到过许多类似介绍各种C++11特性的 ...

随机推荐

  1. 对接快递100&聚水潭API

    对接快递100&聚水潭API 入我相思门,知我相思苦. 简介:对接第三方平台快递100&聚水潭API的简要总结. 1.感悟 个人感觉快递100的API更友好一些,比如有SDK可以调用: ...

  2. day-05-字典

    字典的初识 why: 列表可以存储大量的数据,但数据之间的关联性不强 列表的查询速度比较慢.数量越大查询越慢 what:容器型数据类型:dict how: 数据类型的分类(可变与不可变) 可变(不可哈 ...

  3. [.net] 关于Exception的几点思考和在项目中的使用(三)

    本文链接: https://www.cnblogs.com/hubaijia/p/about-exceptions-3.html 系列文章: 关于Exception的几点思考和在项目中的使用(一) 关 ...

  4. oo暑期课程总结

    一.当时未能完成的作业 未能完成的作业是第四单元的作业. 未能完成的原因主要有以下两点:一是当时对于数据的整理没有好的设计和思路:二是临近期末,未能合理地分配时间导致作业未能完成 二.改进的部分 通过 ...

  5. Unity2D项目-平台、解谜、战斗! 0.2 序言:团队在线协作方案、基线控制

    各位看官老爷们,这里是RuaiRuai工作室,一个做单机游戏的兴趣作坊. 本文跟大家聊一下笔者团队中所使用的在线协作的诸多工具,以及使用这些工具的目的和所记录的内容,希望这些内容在大家团队工作中有所帮 ...

  6. JAP 1.0.1 以及 《JAP产品技术白皮书》正式发布

    快讯 JAP 1.0.1 正式发布 <JAP产品技术白皮书>正式发布.立即获取:白皮书 JAP 1.0.1 版本内容 新增功能/支持 添加 com.fujieid.jap.core.uti ...

  7. 自动化kolla-ansible部署ubuntu20.04+openstack-victoria之物理机配置-01

    自动化kolla-ansible部署ubuntu20.04+openstack-victoria之物理机配置-01  欢迎加QQ群:1026880196  进行交流学习 近期我发现网上有人转载或者复制 ...

  8. MySQL8开启ssl加密

    1 概述 MySQL从5.7开始默认开启SSL加密功能,进入MySQL控制台后输入status可以查看ssl的状态,出现下图表示在使用ssl: 另外,ssl加密需要密钥与证书,可以使用openssl手 ...

  9. 网络编程Netty入门:EventLoopGroup分析

    目录 Netty线程模型 代码示例 NioEventLoopGroup初始化过程 NioEventLoopGroup启动过程 channel的初始化过程 Netty线程模型 Netty实现了React ...

  10. Day09_47_Map

    Map 集合 Map集合** 继承关系** <interface>: Map(接口)<---HashMap(class)/HashTable(class)/SortedMap(子接口 ...