5.谨慎定义类型转换函数
允许编译器进行隐式转换的两种写法:
- 单参构造函数
class Temple{
public:
Temple(const string& c); //转换string 到 Name
//Temple(int num1, int num2 = 2);//或着有默认值的形参,
}
- 拥有隐式类型转换运算符
class Rational
{
public:
operator double() const; //转换Rational 类成double 类型
}
为了防止无意的隐式转换造成很难发现的错误,可以使用其他函数名代替隐式转换运算符:
class Rational
{
public:
double asDouble() const;
}
Rational r(1, 2);
cout << r.asDouble();
cout << r; //error
通过不声明运算符得方法,可以克服隐式类型转换运算符得缺点,但是单参数构造函数不是这么容易绕过。
为了克服这种缺点:
1.为你的单参数构造函数 运用 explicit关键字,拒绝为隐式类型转换调用构造函数。
2.使用代理类。
结论:让编译器进行隐式类型转换所造成的弊端要大于它带来的好处,除非确实需要,不要定义类型转换函数。
6.自增,自减操作符前缀形式与后缀形式的区别
class UPInt {
public:
UPInt& operator++(); //++前缀
const UPInt operator++(int); //++后缀
UPInt& operator--(); //-- 前缀
const UPInt operator--(int);// -- 后缀
UPInt& operator+=(int);// +=
};
参数用来区分前缀和后缀调用。 返回const对象的原因是禁止 i++++这种方式的调用。
效率问题: 尽可能使用前缀调用。
7.不要重载“&&”,“||”, 或 “,”
8.理解不同含义的new和delete
(这个可能会在c++内存管理里归纳,(侯捷老师的课))
//todo