More Effective C学习笔记二:运算符

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

发布了35 篇原创文章 · 获赞 5 · 访问量 385

猜你喜欢

转载自blog.csdn.net/qq_33776188/article/details/104606146