随笔分类 -  Effective C++

摘要:const char *p = "hello";被指物是常量,指针自身不是常量。 char * const p = "hello";被指物不是常量,指针本身是常量。 const char * const p = "hello";被指物和指针本身都是常量。 vector<int> vec; const vector<int>::iterator iter = vec.begin(); // iter是const,不能改变。所指物*iter可以改变。 vector<int>::const_iterato 阅读全文

posted @ 2011-11-27 10:54 SomethingReview

摘要:#define ABC 1.234 ABC也许从未被编译器看见,也许在编译器处理源码之前就被预处理器移走,ABC有可能没有进去记号表(symbol table)内。 #define不仅不能用来定义class专属常量,也不能提供任何封装性。 当在编译期间需要一个class常量值,例如确定数组的大小,可以使用enum。 对一个const取地址是合法的,但是对enum和#define取地址是不合法的。 enum和#define一样不会导致非必要的内存分配。 对于形似函数的宏,最好改用inline函数替换#define,可以获得宏带来的效率以及一般函数的所有可预料行为和类型安全性。 阅读全文

posted @ 2011-11-27 10:54 SomethingReview

摘要:C++由四个次语言中组成,C、Object-Oriented C++、Template C++和STL。从某一个次语言切换到另一个,高效编程守则可能要改变,对内置类型而言,pass-by-value通常比pass-by-reference高效,但当你从C part of C++移往Object-Oriented C++,由于用户自定义构造函数和析构函数的存在,pass-by-reference-to-const往往更好,运用Template C++时尤其如此。然而一旦跨入STL,迭代器和函数对象都是在C指针上塑造的,所以对STL的迭代器和函数对象,pass-by-value守则再次适用。 阅读全文

posted @ 2011-11-27 10:54 SomethingReview

摘要:用explicit声明构造函数,可以阻止它们被用来执行隐式类型转换,但它们仍然可以被用来进行显式类型转换。 “=”语法在新对象被定义时会调用copy构造函数,而不是调用赋值操作。 以by value传递用户自定义的类型通常是个坏主意,pass-by-reference-to-const往往是比较好的选择。 阅读全文

posted @ 2011-11-27 10:54 SomethingReview