`
暴风雪
  • 浏览: 377229 次
  • 性别: Icon_minigender_2
  • 来自: 杭州
社区版块
存档分类
最新评论

《Effective C艹》读书笔记(17)

 
阅读更多

条款24:若所有参数皆需类型转换,请为此采用non-member函数

    看下面这段代码

class num{
public:
    int data;
    num(int a):data(a){}
    num():data(0){}
    const num operator*(num a)const{
        num res;
        res.data = this->data*a.data;
        return res;
    }

};

 当我们这样调用操作符的时候

num b = a*2;

 编译是正确的,因为存在构造函数,所以2被解释成num(2);

但是如果我们这么写

num b = 2*a;

 将不会通过编译,因为2不被认为是num对象,不能调用*(num a)的操作符

对此的解决办法就是,将这个操作符设到类外

class num{
public:
    int data;
    num(int a):data(a){}
    num():data(0){}

};

const num operator*(num a,num b){
    num res;
    res.data = b.data*a.data;
    return res;
}

 也就是说如果你需要为某个函数的所有参数(包括被this指针所指的那个隐喻参数)进行类型转换,那么这个函数必须是个non-member。

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics