more-effective-c++ 序列1

1.仔细区别指针和引用

pointer可以任意指向,referecnce一旦确定不可改变。
pointer需要多一次测试是否为null,引用必有所引。
当你确定会指向某一个东西,而且绝不会改指其他东西,或者由于语法的实现所限制用指针无法实现的,请选择reference,
其他情况尽量使用指针。


2.尽量使用C++转型

static_cast:完成基本功能
const_cast:消除常量性
dynamic_cast:基类指针向派生类指针类型转型,失败返回null,也可以转型引用
reinterpret_cast:编译器相关,不具有可移植性,按比特转。
新式转型更容易辨别,丑陋,容易检测错误,坚持使用。


3.绝不以多态方式处理数组

绝不以基类指针删除由派生类对象构成的数组
Base* p = new Derived[10];
delete []p;
//这样是有很大问题的,当调用数组的每一个对象的时候,由于指针的算术运算是以Base的长度进行偏移,而实际上是以Derived进行偏移。


4.非必要不提供默认构造函数

类的成员函数过于复杂,默认一般是无效值,就会涉及到有效值的判断。
遵循要不不创建,要不创建的就是对的。


5.对[定制的型别转换函数]保持警觉

有两种型别转换:
隐式型别转换:重载operator操作符,将对象转换为需要的类型。(提供一个asDouble方法转换为double,而不是operator double来隐式转换)
单自变量构造:对象的构造函数通过一个参数可以完成构造,可以将参数转换为对象。(explicit操作符或者代理类的方式)
这两个刚好代表两个方向。
使用型别转换虽然可能会带来一些方便,但是它们可能正在调用你不打算调用的函数,这个很危险。


代理类的使用是一种技术,现在还没有看到,随后会逐渐剖析。


6.区别++操作符的前置和后置性质

6.1:区别函数的返回值
6.2:注意后置式以前置式的实现为基础,例子是最好的说明结论。
6.3:前置式不需要临时对象。


class UPInt
{
}
UPInt& UPInt::operator++()//前置式
{
*this += 1;
return *this;
}
const UPInt& UPInt::operator++(int)//后置式
{
UPInt oldValue(*this);
++(*this);
return oldValue;
}


7.千万不要重载&& || ,操作符

对于这些操作符很难提供程序员预期的行为模式
char* p;
...
if(p && strlen(p) > 10) ...
对于这样的语义会有先后判断的语义,当p不成功的话后面的判断不会被执行,这在重载&&操作符的过程中无法提供。
,运算符会要求逗号前面的先被运算,后面的后运算,运算结果以后面的为准,但是重载无法提供这种模式。绝对无法保证逗号前面一定会比
后面的更早被评估。对于这些运算符的重载,无论你怎么努力,都很难将其行为像其应有的一样。


8.了解不同意义的new和delete

8.1 new operator:
string* pstr = new string("TestString");
这个一般会被编译器分解为几步
void* memory = operator new (sizeof (string)); //operator new 分配内存
call string::string("TestString") on *memory;  //内存上调用构造函数
string* pstr = static_cast<string*>(memory);   //强制转换为string*
8.2 operator new:
类似于malloc仅仅用于分配内存,对于分配的内存需要调用operator delete释放内存
8.3 placement new:
如何在已经分配好的内存上调用对象的构造函数来构建对象,需要用到placement new
new (buffer)string("TestString");
buffer为预先通过某些方式分配的内存,这个时候operator new就不用分配内存了,就直接return 这个buffer指针即可。
总结:
如果欲使对象产生于堆:使用new operator,它不但分配内存还调用对象的构造函数
如果仅仅打算分配内存:使用operator new,这样对象的构造函数不会被调用
如果打算在堆对象自己决定内存分布方式,编写自己的operator new,并且使用new operator,它会自动调用你写的operator new 
如果打算在已经分配的内存上构造对象,请使用placement new



你可能感兴趣的:(more-effective-c++ 序列1)