美文网首页
勿在浮沙筑高台--P15-16

勿在浮沙筑高台--P15-16

作者: Catherin_gao | 来源:发表于2021-07-26 19:59 被阅读0次
    • 反向编程和面向对象编程
    • 继承关系中this指针、虚函数

    一. 转换函数 conversion function

    • 自动转换为double类型,并参与运算。
    • 不需要写return type。返回类型与函数名称相同:double
    class Fraction{
    public:
        Fraction(int num, int den=1)
           :m_numerator(num), m_denominator(den)
        operator double() const{
            return (double)(m_numerator/m_denominator);
        }
    
    private:
        int m_numerator;       //分子
        int m_denominator;     //分母
    };
    
    Fraction f(3,5);
    double d=4+f;   //调用operator double() 将 f 转为 double
    

    二. non-explicit-one-argument ctor

    • 非显示一个实参构造函数
    class Fraction{
    public:
        Fraction(int num, int den=1)
           :m_numerator(num), m_denominator(den)
        Fraction operator+ (const Fraction& f){
            return Fraction(....);
        }
    
    private:
        int m_numerator;       //分子
        int m_denominator;     //分母
    };
    
    Fraction f(3,5);
    Fraction d2=f+4;   //调用non-explicit ctor 转为Fraction(4, 1), 然后调用operator+
    

    三. conversion function vs. non-explicit-one-argument ctor

    class Fraction{
    public:
        Fraction(int num, int den=1)
           :m_numerator(num), m_denominator(den)
        operator double() const{
            return (double)(m_numerator/m_denominator);
        }
        Fraction operator+ (const Fraction& f){
            return Fraction(....);
        }
    
    private:
        int m_numerator;       //分子
        int m_denominator;     //分母
    };
    
    Fraction f(3,5);
    Fraction d2=f+4;   //[Error] 编译器可以使用两条路线,会冲突
    

    四. explicit-one-argument ctor

    • 加explict关键字,明确的使用构造函数的时候,再调用构造函数
    class Fraction{
    public:
        explict Fraction(int num, int den=1)
           :m_numerator(num), m_denominator(den)
        operator double() const{
            return (double)(m_numerator/m_denominator);
        }
        Fraction operator+ (const Fraction& f){
            return Fraction(....);
        }
    
    private:
        int m_numerator;       //分子
        int m_denominator;     //分母
    };
    
    Fraction f(3,5);
    Fraction d2=f+4;   //[Error]  conversion from 'double' to 'Fraction'
    

    五. 转换函数的例子

    • 待补充,也是一种经典的设计模式。
    template<class Alloc>
    class vector<bool, Alloc>{
    public:
        typedef __bit_reference
    }
    

    相关文章

      网友评论

          本文标题:勿在浮沙筑高台--P15-16

          本文链接:https://www.haomeiwen.com/subject/oltrtltx.html