条款5: 小心用户自定义的转换函数
两种函数可以让编译器实施隐式转换
1) 单个参数的构造函数
2) 隐式类型转换运算符 例: operator double() const
避免编译器实施隐式转换的方法
1) 对于单参数构造函数,使用explicit关键字
2) 对于隐式类型转换运算符,使用不同于语法关键字但功能相同的函数来替代转换运算符 例:double asDouble() const;
条款6: 区分自增运算符和自减运算符的前缀形式和后缀形式
1) C++规定,后缀形式有一个int类型参数,当函数被调用时,编译器悄无声息传递一个0左右参数
class UPInt
{
public:
UPInt& operator++();
const UPInt operator++(int);
UPInt& operator--();
const UPint operator--(int);
};
2) 前缀运算符返回一个引用,后缀运算符返回一个const对象,所以前缀运算符效率高,应该尽量使用前缀运算符.
UPInt& UPInt::operator ++()
{
*this+=1;
return *this;
}
const UPInt UPInt::operator ++(int)
{
const UPInt oldValue = *this;
*this+=1;
return oldValue;
}
3) 后缀运算符返回const得原因
避免出现i++++的情况,如果不返回consts, i++++实际只+了一次,如果加上const,则i++++编译出错.
条款7: 不要重载&&, ||和,
1) 短路求值法
布尔表达式从左往右求值,一旦确定该表达式的值就停止运算.
2)不要重载&& || ,的原因
会破坏短路求值法,破环用户习惯.
条款8: 理解new delte在不同情形下的含义
1) new operator
1. 调用operator new分配内存
2. 调用构造函数
3. 调用static_cast把void*cast成对象指针
2) operator new
void* operator new(t_size size);
分配内存
3) placement new
void* operator new(size_t, void* location)
{
return location;
}
在已经有指针指向的内存里建立一个对象