zoukankan      html  css  js  c++  java
  • C++11:22委托构造函数和继承构造函数

    22、委托构造函数和继承构造函数

    0、课前秀

    1、委托构造函数

    • 委托构造函数:允许在同一个类中一个构造函数可以调用另外一个构造函数,从而可以在初始化时简化变量的初始化。

    • 没有用构造函数的场景(无实际意义)

    class class_c{
    public:
        int max;
        int min;
        int middle;
        
        class_c {}
        class_c(int my_max){
            max = my_max > 0 ? my_max : 10;
        }
        
        class_c(int my_max, int my_min){
            max = my_max > 0 ? my_max : 10;
            min = my_min > 0 && my_min < max ? my_min : 1;
        }
        
        class_c(int my_max, int my_min, int my_middle){
            max = my_max > 0 ? my_max : 10;
            min = my_min > 0 && my_min < max ? my_min : 1;
            middle = my_middle < max && my_middle > min ? my_middle : 5;
        }
    };
    
    • 委托构造函数的写法
    class class_c{
    public:
        int max;
        int min;
        int middle;
        
        class_c(int my_max){
            max = my_max > 0 ? my_max : 10;
        }
        
        class_c(int my_max, int my_min):class_c(my_max) {
            min = my_min > 0 && my_min < max ? my_min : 1;
        }
        
        class_c(int my_max, int my_min, int my_middle):class_c(my_max,my_min){
            middle = my_middle < max && my_middle > min ? my_middle : 5;
        }
    };
    
    int main()
    {
        class_c c1{1,3,2};
    }
    
    • 使用委托构造函数需要注意:使用了代理构造函数就不能用类成员初始化了
    class class_a{
    public:
        class_a(){}
        //member initialization here, no delegate
        class_a(string str):m_string(str){}
        
        //调用了委托构造函数,不能用类成员初始化了
        //error C3511: a call to a delegating constructor shall be the only member-initializer
        class_a(string str, double dbl):class_a(str),m_double(dbl){}
        
        //只能通过成员赋值来初始化
        class_a(string str, double dbl):class_a(str){m_double = dbl;}
        double m_double{1.0};
        string m_string;
    };
    

    2、继承构造函数

    • 可以让派生类直接使用基类的构造函数,而无须自已再写构造函数,尤其是在基类有很多构造函数的情况下,可以极大地简化派s生类构造函数的编写
    struct Base
    {
        int x;
        double y;
        string s;
        
        Base(int i):x(i),y(0){}
        Base(int i, double j):x(i),y(j){}
        Base(int i, double j,const string& str):x(i),y(j),s(str){}
    }
    
    //直接派生,会报错
    struct Derived1 : Base
    {
        
    };
    
    int main()
    {
        Derived1 d(1,2.5,"ok"); //编译错误,没有合适的构造函数
    }
    
    //在派生类中定义构造函数
    struct Derived2 : Base
    {
        Derived2(int i):Base(i) {}
        Derived2(int i, double j):Base(i,j) {}
        Derived2(int i, double j, const string& str):Base(i,j,str) {}
    };
    
    int main()
    {
        int i = 1;
        double j = 1.23;
        Derived2 d(i);
        Derived2 d1(i,j);
        Derived2 d2(i,j,"");
        return 0;
    }
    
    struct Derived : Base
    {
        using Base::Base; //声明使用基类构造函数
    };
    
    int main()
    {
        int i = 1;
        double j = 1.23;
        Derived d(i);  //直接使用基类构造函数来构造派生类对象
        Derived d1(i,j);
        Derived d2(i,j,"");
        return 0;
    }
    

    ReadMe

    • 20200508看完第一版,《深入应用C++11》
  • 相关阅读:
    Java后端WebSocket的Tomcat实现
    Swift学习资源
    jwplayer 隐藏属性方法记载
    简单的java socket 示例
    SQL SERVER 2008/2012/2012R2/2014 设置开启远程连接(sa配置)
    JS原型继承和类式继承
    理解js中的原型链,prototype与__proto__的关系
    C# 事件(Event)
    Java 与 JavaScript 对websocket的使用
    C# 版dll 程序集合并工具
  • 原文地址:https://www.cnblogs.com/fewolflion/p/12960338.html
Copyright © 2011-2022 走看看