More Effiective C++
Simon|
这个作者很懒,什么都没留下…
展开
-
条款1:仔细区别points和references
指针和引用主要有三个区别。1:引用必须初始化,但是指针可以为null。 int* a = NULL; int &b;//这里报错 int c = 10; int &d = c;2:使用引用可能会比使用指针更有效率。主要原因是使用引用之前不需要测试其有效性。void printDouble(const double &a){ cout <...原创 2018-11-26 09:18:11 · 209 阅读 · 0 评论 -
条款2:最好使用c++转型操作符
C转型方式有两个缺点,一是它几乎允许将任何类型转化为任何其他类型,二是它的语法结构难以辨识。为了解决C旧式转型的缺点,C++导入4个新的转型操作符。1.static_cast<type> (expression)static_cast基本上拥有与C旧式转型相同的威力与意义,以及相同的限制。 double b = 10; int a = static_cast<...原创 2018-11-26 09:56:12 · 173 阅读 · 0 评论 -
条款3:绝对不要以多态方式处理数组
继承里面有一个性质:可以通过指向基类的指针操作派生类的对象。假设有一个类BST(binary rearch tree),以及一个继承自BST的类BalanceBST;现在考虑下面一个函数,用来打印BSTs数组中的每一个BST的内容:void printBSTArray(ostream& s, const BST array[], int numElements){ for...原创 2018-11-26 10:25:15 · 200 阅读 · 0 评论 -
条款4:非必要不提供 default constructor
1. 有些类的数据成员的值是必要的,因而在创建时就应该提供其值,其中的一个强制实现的方法就是不提供默认构造函数,如果不这么做的话,在使用对象的时候就要检验那个数据成员是否被正确赋值。2. 如果为了强制某些数据成员在创建对象时就被赋值而不提供默认构造函数,那么在创建该对象的数组时就会遭遇因为没有默认构造函数而无法创建的情况,主要的解决方法有以下三种: 1)在栈中创建数组并使用显示初始化...原创 2018-11-26 13:53:17 · 381 阅读 · 2 评论 -
条款5:对定制的“类型转换函数”保持警觉
c++允许编译器在不同类型之间执行隐式转换,方法有两种:单自变量构造函数和隐式类型转换操作符。单自变量构造函数:可能声明拥有单一参数,也可能声明拥有多个参数,并且除了第一参数之外都有默认值。class Name{public: Name(const string& s);};class Rational{public: Rational(int numerato...原创 2018-11-26 19:54:48 · 163 阅读 · 0 评论 -
条款6:区别incarement/decrement操作符的前置(prefix)和后置(postfix)形式
这章主要讲i++和++i的区别。class UPInt //"unlimited precision int"{public: UPInt& operator++(); const UPInt operator++(int); UPInt& operator--(); const UPInt operator--(int); UPInt operator+=...原创 2018-11-27 10:36:13 · 263 阅读 · 0 评论 -
条款7:千万不要重载&&,||和,操作符
1:&&和||操作符C++和C对于"真假表达式"采用所谓的"骤死式"评估方式。char *p;if(p!=0 && strlen(p)>10)...int rangeCheck(int index){ if(index < lowerBound || index > upBound ) { retu...原创 2018-11-27 10:56:41 · 286 阅读 · 0 评论 -
条款8:了解各种不同意义的new和delete
1:new operatorstring *ps = new string("Memory Management");这个代码很熟悉,主要做两件事情:一是分配足够的内存,用来放置某类型对象,二是调用构造函数为对象设定初值。new operator 总是做这两件事,无论如何你不能改变其行为。无法重载。2:operator newvoid * operator new(size...原创 2018-11-27 19:15:11 · 242 阅读 · 0 评论