Exceptional_C++
Table of Contents
  • 1 编译防火墙和Pimp惯用法
  • 2 名字查找,名字控件和接口规则

1 编译防火墙和Pimp惯用法
  1. 对于函数的参数类型和返回值类型来说,只需要前置申明就足够了 被继承的基类必须有完整的定义,这样编译器才能确定子类对象的大小,虚函数以及其他基本信息. 定义类中的成员变量类型,必须有完整的定义(指针不需要),这样才能确定子类对象的大小
  2. 如果只要流的前置申明,应该优先使用#include<iosfwd>
  3. 如果只需要前置申明,绝对不要用#include包含相应的头文件
  4. 对于广泛应用的类,应该优先使用Pimpl惯用法来隐藏实现细节,通过一个不透明的指针(指向一个进行了前置声明但又没有定义的类)来保存私有成员(包括成员变量和成员函数).
    • 不能将虚成员函数放在Pimpl隐藏起来,这是为了能够在更深层次的派生类中进行覆盖
    • Pimpl中的函数可能需要一个指向可见对象的回指指针,并通过这个指针来调用可见类中的函数,这将会增加一个间接层
    • 通常,最好的折中方法就是将所有的私有成员(包括成员变量和函数)放入Pimpl中,并将只有私有成员才会调用的非私有函数也放入Pimpl中.
    • protected成员永远不应该被放入Pimpl中,因为这样会使保护成员失去其应有的作用.
    • 在某些情况下可以将Pimpl写成与原来的类完全一样的形式,而将原来的类写成仅由转调函数组成的共有接口.但这样原来的类在继承时基本无用了.
  5. 只有当性能分析和经验教训都证明了,确实需要有额外的性能提升时,才使用Pimpl惯用法,并且在通常情况下使用pimpl,而在特殊情况下使用Fast Pimpl(使用定容量的Allocator)

2 名字查找,名字控件和接口规则
  1. 如果在声明函数的参数时,使用了一个类(例如NS::T),那么在查找正确的函数名字时,编译器在包含参数类型的名字空间中也会进行参数名字的匹配.

    
    
    1. namespace NS
    2. {
    3. class T{};
    4. void f(T);
    5. }
    6. NS::T parm;
    7. int main()
    8. {
    9. f(parm);
    10. }
  2. 所有的函数(包括自由函数,非类的成员函数)也可以在逻辑上看成是类X的一部分(它们可以看作是类X接口的一部分),如果它满足:
    • 使用了类X
    • 与X同时被定义(在同一个头文件/同一个命名空间中)
  3. 如果在客户代码中定义了一个使用类X的函数,并且这个函数与X所在的命名空间(不是类空间!),并且这个函数与X所在的命名空间中的一个函数原型相匹配,那么这个函数的调用将出现二义性
    
    
    1. namespace A
    2. {
    3. class X{};
    4. void f(X);
    5. }
    6. namespace B
    7. {
    8. void f(A::X);
    9. void g(A::X param)
    10. {
    11. f(param)  //二义性:是A::f还是B::f?
    12. }
    13. }
  4. 根据接口规则,成员函数与类的关系要强于非成员函数与类的关系,例如
    
    
    1. namespace A
    2. {
    3. class X{};
    4. void f(X);
    5. }
    6. class B
    7. {
    8. void f(A::X);
    9. void g(A::X param)
    10. {
    11. f(param)  //不存在二义性,使用B::f,因为成员函数与类的关系更强于非成员函数与类的关系
    12. }
    13. }
  5. 从接口规则中可以推断出如果A和B是两个类,并且f(A,B)是一个自由函数,那么
    • 如果A和f同时被定义,那么f就是A的一部分,因此A将依赖于B
    • 如果B和f同时被定义,那么f就是B的一部分,因此B将依赖于A
    • 如果A,B和f同时被定义,那么f即是A的一部分,也是B的一部分,因此A和B相互依赖
  6. 派生类中的名字隐藏问题在所有的嵌套作用域中也同样存在,其中包括命名空间.
  7. 当在基类/派生类的名字隐藏中遇到这样的问题时,可以有两种解决方案:
    • 让调用代码明确第指出它想调用的函数
    • 通过using申明语句使它向调用的函数在正确的作用域中是可见的.
  8. 正确地使用命名空间.如果将一个类放入命名空间,那么同时要保证将这个类的所有辅助函数和运算符函数也放入相同的命名空间.否则,你将在代码中发现奇怪的结果.

Date: 2013-04-14 22:51:54 中国标准时间
Author:
Org version 7.8.11 with Emacs version 24

Validate XHTML 1.0

本文出自 “暗日” 博客,请务必保留此出处http://darksun.blog.51cto.com/3874064/1178200

《Exceptional C++》笔记(1)相关推荐

  1. 《微软的梦工场》 笔记(1)

    转载于:https://www.cnblogs.com/wmxnlfd/p/10630918.html

  2. 阿里重金投数梦工场 布局PaaS动了谁的奶酪

    就目前云计算市场来看,巨头的争夺表面上还在IaaS激战,但实际上他们对PaaS也在默默布局.6月8日,PaaS相关服务商数梦工场宣布完成光大实业资本.阿里巴巴等公司共同投资的7.5亿元A轮融资.值得注 ...

  3. 数梦工场联手阿里云 推出大数据一体机

    本文讲的是数梦工场联手阿里云 推出大数据一体机[IT168 云计算]8月19日消息,作为全球领先的云计算和大数据场景化开发与服务提供商,数梦工场依托阿里云"飞天"大规模分布式计算系 ...

  4. 数梦工场助力云计算国标制定

    当前我国移动互联.云计算.大数据.物联网和工业控制等新技术.新应用处于高速发展阶段,面对全球网络安全戒备态势,各领域信息安全等级保护工作亟须完善.全国信息安全标准化技术委员会(SAC/TC 260)提 ...

  5. 数梦工场:我们帮你实现你驾驭数据的梦想

    6月4日,在第七届中国云计算大会上,数梦工场总裁王巍介绍说,数梦工场的数就是大数据,数梦工厂在大数据的基础上实现云架构:梦就是中国梦,数梦工厂解读中国梦为青山绿水.人民幸福.政治安定和经济繁荣:第三, ...

  6. 6月13日云栖精选夜读:数梦工场完成A轮7.5亿融资 三个维度构建“新型互联网”

    原文链接 在演讲中,吴敬传借助三个故事,从三个维度讲述了如何构建"新型互联网". 热点热 议 数梦工场完成A轮7.5亿融资 三个维度构建"新型互联网" 作者:阿 ...

  7. 数梦工场携手宁波共建创新大数据云基地

    2016年1月17日上午,宁波大数据云基地揭牌暨项目签约仪式在慈溪市政府举行.杭州数梦工场科技有限公司与慈溪市政府达成战略共识,建设区域综合性大数据云基地,旨在促进云计算.大数据技术在政务.经济.民生 ...

  8. 数梦工场7.5亿元都干点啥?

    数梦工场董事长兼CEO 吴敬传在发布会上做了以"数据连接梦想"为主题的演讲,首次提出"新型互联网"理念.吴敬传讲了3个小故事,从3个维度阐述了如何构建" ...

  9. 8.25关于笔试面试(数梦工场亲宝宝)

    Java笔试面试: ①亲宝宝(三天后回复): (1)时间:2018/8/24 9:29:00 (2)笔试: 1.String类.Integer类的各个方法的实现(主要是equals.hashCode方 ...

  10. 数梦工场,新型互联网领域“独角兽”出笼

    6月8日,杭州数梦工场科技有限公司迎来了公司发展历程中的一个重要里程碑--成功完成A轮融资,获得由光大实业资本.阿里巴巴等公司共同投资的7.5亿元,公司市场估值超过10亿美元.云计算大数据领域的又一家 ...

最新文章

  1. java中的char类型
  2. java登录界面命令_Java命令行界面(第25部分):JCommando
  3. 再送一波干货,测试2000线程并发下同时查询1000万条数据库表及索引优化
  4. linux下安装libsvm_在ubuntu下的Matlab中使用libsvm
  5. nginx重启、关闭
  6. php 采集程序 宋正河
  7. Entity Framework安装方法
  8. SPOJ QTree【树链剖分】
  9. Vector Math for 3D Computer Graphics
  10. DisC-Decompiler for TurboC
  11. 斐讯K2路由器刷固件实现校园网可使用
  12. 联想微型计算机扬天M4000e,联想扬天M4000e-00评测:傲腾内存加持下的商务整机
  13. 二维傅立叶变换和二维傅立叶反变换
  14. 计算机专业立项课题研究,计算机类课题研究选题参考
  15. 阿里云SSL证书免费申请和部署方法((DigiCert 免费版 SSL-图文教程)
  16. 重言式判别 (数据结构课程设计)
  17. PTC指定位置安装许可服务器,PTC安装在终端服务器上的問題
  18. deepin win10字体_购机指南 | Deepin 初次体验,国产OS还有很长路要走
  19. ffmpeg example演示教程 -AudioDecode
  20. Selective Search 学习笔记

热门文章

  1. 页面数据导出为word或者excel
  2. 从零实现一个在线考试系统
  3. [笔记]OpenCV+FFmpeg+Qt实现视频编辑器之OpenCV vs2015编译
  4. Java:实现先进先出缓存FIFO算法(附完整源码)
  5. EOS中JAVA从Linux下载文件,教程 - 在Linux上安装EOS
  6. 云壳卸载会记录吗_行车记录仪自带电子狗违法吗?记录仪电子狗会扣分吗
  7. 普鸥知识产权|亚马逊商标专利版权侵权有遇到吗?
  8. python 网络监控系统手机版下载_云视通网络监控系统手机版
  9. 学什么方向的计算机专业以后就业比较吃香?
  10. shell 中的特殊符号的含义