zoukankan      html  css  js  c++  java
  • Effective C++:规定24:如果所有的单位都需要的参数类型转换,使用请做到这一点non-member功能

    (一个)

    如果一个class。同意整数隐式转换为”有理数似乎非常合理。

    class Rational{ 
    public: 
        Rational(int numerator = 0, int denominator = 1); //刻意不为explicit;同意int-to-Rational隐式转换 
        int numerator()const; 
        int denominator()const; 
    };

    在支持算术运算符时考虑该由member函数、还是non-member函数来实现:

    (1)成员函数的写法:

    class Rational{ 
    public:
        const Rational operator*(const Rational& rhs) const; 
    };
    
    Rational oneEight(1,8);
    Rational onehalf(1,2);
    Rational result = oneHalf * oneEight;   //nice
    result = result * oneEight;   //ok
    可是你希望支持混合运算:
    result = oneHalf * 2;   //ok 2发生了隐式类型转换。

    result = 2 * oneHalf; //wrong !!!

    编译器将上述语句转换为下面语句:

    result = oneHalf.operator*(2);   //ok
    result = 2.operator*(oneHalf);   //wrong!

    oneHalf是一个含operator*函数的class的一个对象。可是2却没有对应的class,编译器会尝试寻找可被下面这般调用的non-member operator*(也就是在命名空间内 或 global作用域内):

    result = operator*(2, oneHalf);//wrong!

    本例不存在这样一个接受int和Rational作为參数的non-member operator* 因此查找失败。

    仅仅有当參数被列于參数列(parameter list)内,这个參数才是隐式类型转换的合格參与者

    地位相当于“被调用之成员函数所隶属的那个对象”——即this对象的那个隐喻參数,绝不是隐式转换的合格參与者



    (二)解决这样的问题的方法:

    为了支持混合运算。让operator* 成为一个non-member函数。便同意编译器在每个实參身上运行隐式类型转换:

    const Rational operator*(const Rational& lhs, const Rational& rhs) 
    { 
        return Rational(lhs.numerator() * rhs.numerator(), lhs.denominator() * rhs.denominator()); 
    }
    
    result = 2 * oneHalf;//ok。最终编译通过了!
    operator*是否要成为Rational的friend函数呢?答案是否定的。由于operator*全然籍由Rational的public接口完毕任务;

    不管何时假设你能够避免friend函数就该避免。




    请记住:

    假设你须要为某个函数的全部參数(包含被this指针所指的那个隐喻參数)进行类型转换,那么这个函数必须是个non-member。




    版权声明:本文博客原创文章。博客,未经同意,不得转载。

  • 相关阅读:
    Java实现 LeetCode 432 全 O(1) 的数据结构
    Java实现 LeetCode 432 全 O(1) 的数据结构
    Makefile 自动生成依赖
    比较详细的利用虚拟机对SD卡FAT32+EXT4+Ext4分区图解教程
    STM32F0308开发环境的选择--CooCox CoIDE篇
    linux下包管理命令yum与apt-get以及开发环境配置
    裸机编程与OS环境编程的有关思考
    Eclipse C/C++环境配置
    Linux Eclipse代码提示功能设置(Java & C/C++)
    Linux下高效编写Shell——shell特殊字符汇总
  • 原文地址:https://www.cnblogs.com/gcczhongduan/p/4613540.html
Copyright © 2011-2022 走看看