Chinaunix首页 | 论坛 | 博客
  • 博客访问: 46910
  • 博文数量: 13
  • 博客积分: 1497
  • 博客等级: 上尉
  • 技术积分: 150
  • 用 户 组: 普通用户
  • 注册时间: 2009-01-04 00:03
文章分类
文章存档

2011年(1)

2010年(1)

2009年(11)

我的朋友

分类: C/C++

2009-02-27 23:05:24

1,Vector : size,resize和capacity,reserve的区别。[]和at的区别,后者有越界检查,会抛出异常,前者不会。push_back可以不用但新内存空间问题.
2,sprintf代码清晰,无额外内存分配,长度不安全,类型不安全,不可在模版当中使用。snprintf加上了长度限制,stringstream,strstream
3,mem_func,mem_func_ref仿函数的adapter.
4,减少泛型限制,不要引入太多的限制,强制使用的类必须遵守某些接口。std::swap是一个例子。
5,函数选择:非模版函数第一。如果没有非模版函数,主函数模板进行重载的比较,选择类型最合适的。找到后再考虑函数模版的全特化。函数模版不能被偏特化,只能用重载来代替。template void f(T);template void f(T*);这是重载。
template <> void f(int)(int*),这是特化。函数模版特化并不参与重载决议。如果想要加入一个自己的针对特殊情况进行处理的模版函数的“特别版”并想让它参与重载,千万不要写出函数模版特化,将它写成一个具有相应签名的普通函数即可。
6,指定模板方法为友元:如果所指的确实是一个模板,而你的表达方式可能存在歧义的话,可以在模版名字后面加上模版实参列表。特殊情况是有限定名的方法,在名字空间中,
7,首先,构造虚基类子对象;其次构造非虚基类子对象;再次,构造所以成员;最后构造X本身。
8,标准形式偷偷访问私有成员的方法:特花模板。针对任何类型来特化一个成员模板是合法的。永远不要对语言搞破坏。例如,永远不要企图通过复制类定义再添加友元声明,或提供成员模板函数特化等途径来破坏封装性。
9,private成员的名字只对其所属类的其他成员或友元来说是可访问的,而这里的其他成员包括成员模板的任何显式特化(不管某个给定的显式特化是否为意料之中的)。private成员对于任何能够看到所属类定义的代码都是可见的,它会参与重载决议和名字查找,因而肯会使调用变得无效或者具有二义性。私有的虚拟函数对于子类来说是不可访问但是可见的,它可以重写。
10,尽量使用非虚接口模式来使接口稳定,将可订制的行为放到非公用需函数当中。这个也是模式。应当尽量将基类的虚函数放在私有字段。
11,4个类成员函数可以被编译器隐式生成,分别为:默认构造函数,复制构造函数,复制赋值操作符以及析构函数。这是为了和struts兼容。他们可能抛出任何异常。派生类函数的异常规格必须至少跟对应的继承的虚寒树一样严格。为了阻止编译器为派生类隐式生成默认构造函数,复制构造函数或者复制赋值操作符,最简单,最佳的选择就是将基类中相应的函数“藏”在非公用区段。
12,内联并不是宏,他们的工作方式不同。内联并不影响任何的语义,仍然可以获得内联函数的函数地址。其实它的意思是“我们知道将该函数在它的任意调用点上内联是合适的”,即内联某处函数调用。避免写inline或试图进行其他优化,除非性能测试显示出有此必要。虽然书中说内联进行的阶段几乎是任何阶段,但对于C++来说,一般就是编译和连接,我一直以为是编译,把它当作宏来看,这是错误的。连接时的内联就要看编译器的功能了。
13,不要用auto和register,记住,他们跟空白没有什么区别。
14,浮点运算时神秘且深奥难懂的,请避免依赖于浮点转换操作。要么double,要么完蛋。double可以表示所有整数,而float不能

阅读(818) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~