读书笔记之:Exceptional C++ Style (2004) [++]

1. vector中元素的访问:[]与at操作

2. 调整vector的大小:reserve

reserve是保证vector的容量至少为某个值,它不会减少vector的容量。

resize是改变vector的大小,这个操作比较严格,给出多少,结果vector的容量就变为多少。

3. sprint的替代方案

 

4. 定位new表达式

5. 模板特化与函数重载

类模板可以被偏特化或者全特化,函数模板则只能够被全特化

重载决议只决定选出主模板

分析下面的代码:

#include <iostream>
using  namespace std;
template < class T>
void f(T){
    cout<< " f(T) "<<endl;
}
template < class T>
void f(T*){
    cout<< " f(T*) "<<endl;
}
template<>
void f< int>( int*){
    cout<< " f<int>(int*) "<<endl;
}
template<>
void f< int*>( int*){
    cout<< " f<int*>(int*) "<<endl;
}                              
int main(){
     int *p;
    f(p);
}

 

程序运行结果是:f<int>(int*)

即调用的是第3个函数。

这儿容易让人疑惑的是,为什么不是第4个函数:template<>void f<int*>(int*) 呢?这个是template <class T>void f(T)的模板特化啊。

要理解这个就需要注意一点:带有函数模板的重载进行决议的时候,选择的规则是首先选择最优的普通函数,如果没有适合的普通函数那么就要从模板函数中选择。而进行选择的时候,是决定选择的哪个主模板函数,然后再看这个主模板函数是否存在对应的特化。所以,对于上面的选择,首先是在

template <class T>

void f(T)

template <class T>

void f(T*)

之间进行选择,发现第2个更加合适,这样就确定了主模板函数,然后在查找该主模板函数是否有对应的特化函数,这样正好找到了

template<>

void f<int>(int*)

它是对int的特化,所以最后选择了这个函数。

 

分开看是如下:

 

6. 异常使用的正确位置

资源获取即初始化RAII

尽量通过析构函数来进行异常环境下的自动清理工作,而不是通过try/catch块

永远不要允许析构函数、释放操作(deallocation)以及swap()函数抛出任何异常,因为否则的话,就没法安全且可靠地进行资源的清理了。

 

7. 违反异常规格

C++中的一些比较不起眼的特性,逐渐被尘封在语言的角落,直到许多人甚至于忘记了它们的存在。这正是为什么你看到的关于它们的文章总是相对较少,譬如像valarray、bitset、locale以及实际上是合法的表达式"5[a]"这些冷僻的特性。而对于异常规格来说同样如此。

如果函数违反了异常规格的话,该函数肯定不能够以通常的函数返回方式返回,而它做的事情有如下两件:

8. 类继承中构造顺序

 

验证程序如下:

#include <iostream>
using  namespace std;
class B1{
     public:
    B1(){ cout<< " Constructor:B1() "<<endl; }
};
class V1: public B1{
     public:
    V1(){ cout<< " Constructor:V1() "<<endl; }
};
class D1: virtual  public V1{
     public:
    D1(){ cout<< " Constructor:D1() "<<endl; }
};

class B2{
     public:
    B2(){ cout<< " Constructor:B2() "<<endl; }
};
class B3{
     public:
    B3(){ cout<< " Constructor:B3() "<<endl; }
};
class V2: public B1, public B2{
     public:
    V2(){ cout<< " Constructor:V2() "<<endl; }
};
class D2: virtual  public V2, public B3{
     public:
    D2(){ cout<< " Constructor:D2() "<<endl; }
};
class M1{
     public:
    M1(){ cout<< " Constructor:M1() "<<endl; }
};
class M2{
     public:
    M2(){ cout<< " Constructor:M2() "<<endl; }
};
class X: public D1, public D2{
     public:
    X(){ cout<< " Constructor:X() "<<endl; }                     
    M1 m1_;
    M2 m2_;
};
int main(){
    X x;
}

 

9. 访问权限的使用

 

10. 类中隐式声明的函数

11. C++中不同层次的内存分配情况

12. new或malloc实际分配空间的大小

如果想到内存对齐的情况,这个问题就很好解决了。

内存对齐的情况要求实际得到的内存肯定不会小于要求分配的。一般都是高于这个值。

 

13. STL中各容器额外的内存开销

 

14. C++中new三种形式

 

15. 类相关的new:与全局new是不同的

简单new:plain new的重载

定位new:placement new的重载

nothrow new的重载

16. 初始化陷阱

注意在初始化的时候,不要搞成函数声明

 

17. C++操作符上的贪婪匹配

18. C++中的union

 

19. 单片式设计陷阱

 

 

 

转载于:https://www.cnblogs.com/xkfz007/archive/2012/08/18/2645568.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
exceptional c++:47个c++工程难题、编程问题和解决方案(中文版)》讲述如何用标准c++进行企业级的软件开发,通过“问题/解答”的方式,启发读者思考,帮助了解隐藏在问题背后的设计思想,以及各种编程指导原则适用的场合。本书列出的条款涵盖了许多方面的主题,尤其对异常安全性、类和模块的合理设计,正确的代码优化,以及编写符合c++标准的可移植代码进行了深入的讨论。   《exceptional c++:47个c++工程难题、编程问题和解决方案(中文版)》适于有一定c++编程基础的读者阅读。 目录 《exceptional c++:47个c++工程难题、编程问题和解决方案(中文版)》 1 泛型程序设计与c++标准库 1 条款1:迭代器难度系数 1 条款2:大小写不敏感的字符串——之一 5 条款3:大小写不敏感的字符串——之二 9 条款4:可重用性最高的泛型容器——之一 12 条款5:可重用性最高的泛型容器——之二 13 条款6:临时对象 22 条款7:标准库的使用(或者,再论临时对象) 28 2 异常安全性相关的问题与技术 31 条款8:编写异常安全的代码——之一 32 条款9:编写异常安全的代码——之二 37 条款10:编写异常安全的代码——之三 40 条款11:编写异常安全的代码——之四 47 条款12:编写异常安全的代码——之五 50 条款13:编写异常安全的代码——之六 56 条款14:编写异常安全的代码——之七 62 条款15:编写异常安全的代码——之八 65 条款16:编写异常安全的代码——之九 68 条款17:编写异常安全的代码——之十 73 条款18:代码的复杂性——之一 75 条款19:代码的复杂性——之二 79 3 类的设计与继承 85 条款20:类的编写技巧 85 条款21:虚函数的重载 93 条款22:类之间的关系——之一 99 条款23:类之间的关系——之二 103 条款24:继承的使用和滥用 110 条款25:面向对象程序设计 121 4 编译器防火墙和pimpl惯用法 123 条款26:将编译期依赖性降到最低——之一 123 条款27:将编译期依赖性降到最低——之二 127 条款28:将编译期依赖性降到最低——之三 132 条款29:编译防火墙 135 条款30:fast pimpl惯用法 138 5 名字查找、名字空间和接口规则 148 条款31:名字查找与接口规则——之一 148 条款32:名字查找与接口规则——之二 152 条款33:名字查找和接口规则——之三 162 条款34:名字查找与接口规则——之四 167 6 内存管理 176 条款35:内存管理——之一 176 条款36:内存管理——之二 179 条款37:auto_ptr 186 7 误区、陷阱以及错误的惯用法 201 条款38:对象标识 201 条款39:自动转换 204 条款40:对象的生存期——之一 206 条款41:对象的生存期——之二 209 8 其他主题 219 条款42:变量的初始化 219 条款43:正确使用const 222 条款44:类型转换 231 条款45:bool 238 条款46:转调函数 242 条款47:控制流程 244 后记 254 参考书目 256

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值