• 构造函数初始化列表


    通过构造函数初始化参数,可能经常会这么干:

    class TEST
    {
    private:
        /* data */
    public:
        TEST(int abc,int bcd,int fds);
        ~TEST();
        
    public:
        int abc;
        int bcd;
        int fds;
    };
    
    TEST::TEST(int abc,int bcd,int fds)
    {
        this->abc = abc;
        this->bcd = bcd;
        this->fds = fds;
    }
    
    TEST::~TEST()
    {
    }

    为了简化这种写法,我们采用初始化列表

    class TEST
    {
    private:
        /* data */
    public:
        TEST(int a,int b,int c);
        ~TEST();
    
    
    public:
        int abc;
        int bcd;
        int fds;
    };
    
    TEST::TEST(int a,int b,int c):abc(a),bcd(b),fds(c)
    {
        
    }
    
    TEST::~TEST()
    {
    }

    和上面的写法作用相同,都是把局部变量的值传给test的成员变量

    也可以不写参数,直接给他赋值

    class TEST
    {
    private:
        /* data */
    public:
        TEST();
        ~TEST();
    
    
    public:
        int abc;
        int bcd;
        int fds;
    };
    
    TEST::TEST():abc(5),bcd(6),fds(7)
    {
        
    }
    
    TEST::~TEST()
    {
    }

    这样在使用TEST的时候他们的值 直接就是 5 6 7

    测试:

    #include <iostream>
    #include <stdio.h>
    
    
    using namespace std;
    
    class TEST
    {
    private:
        /* data */
    public:
        TEST();
        ~TEST();
    
        void p_printf();
    
    public:
        int abc;
        int bcd;
        int fds;
    };
    
    TEST::TEST():abc(5),bcd(6),fds(7)
    {
        
    }
    
    TEST::~TEST()
    {
    }
    
    void TEST::p_printf()
    {
        printf("---%d---
    ",this->abc);
        printf("---%d---
    ",this->bcd);
        printf("---%d---
    ",this->fds);
    }
    
    int main(int argc, char const *argv[])
    {
        TEST test;
        test.p_printf();
        return 0;
    }

    输出:

    ---5---
    ---6---
    ---7---

    初始化 const 成员变量的唯一方法就是使用初始化列表

    假设上面例子中的成员都是const修饰的

    class TEST
    {
    private:
        /* data */
    public:
        TEST(int a,int b,int c);
        ~TEST();
    
        void p_printf();
    
    public:
        const int abc;
        const int fds;
        const int bcd;
    };
    
    TEST::TEST(int a,int b,int c)
    {
        this->abc = a;
        this->bcd = b;
        this->fds = c;
        
    }
    
    TEST::~TEST()
    {
    }

    这样初始化是不会成功的

    报错如下

    test.cpp: In constructor ‘TEST::TEST(int, int, int)’:
    test.cpp:23:1: error: uninitialized const member inconst int’ [-fpermissive]
     TEST::TEST(int a,int b,int c)
     ^
    test.cpp:18:12: note: ‘const int TEST::abc’ should be initialized
      const int abc;
                ^
    test.cpp:23:1: error: uninitialized const member inconst int’ [-fpermissive]
     TEST::TEST(int a,int b,int c)
     ^
    test.cpp:19:12: note: ‘const int TEST::fds’ should be initialized
      const int fds;
                ^
    test.cpp:23:1: error: uninitialized const member inconst int’ [-fpermissive]
     TEST::TEST(int a,int b,int c)
     ^
    test.cpp:20:12: note: ‘const int TEST::bcd’ should be initialized
      const int bcd;
                ^
    test.cpp:25:12: error: assignment of read-only member ‘TEST::abc’
      this->abc = a;
                ^
    test.cpp:26:12: error: assignment of read-only member ‘TEST::bcd’
      this->bcd = b;
                ^
    test.cpp:27:12: error: assignment of read-only member ‘TEST::fds’
      this->fds = c;
                ^

    这个时候只能选择用初始化例表的方式初始化const修饰的成员变量

    class TEST
    {
    private:
        /* data */
    public:
        TEST(int a,int b,int c);
        ~TEST();
    
        void p_printf();
    
    public:
        const int abc;
        const int fds;
        const int bcd;
    };
    
    TEST::TEST(int a,int b,int c):abc(a),bcd(b),fds(c)
    {    
    }
    
    TEST::~TEST()
    {
    }
  • 相关阅读:
    ZMQ面面观
    windows10系统右键新建菜单的自定义
    元组,列表,字典前加*
    HTTP状态码(转)
    字符串利用%02d将月份前加0
    python中while与else的联姻
    sys.argv
    pandas的read_csv踩到的坑
    wireshark抓包总结
    bcolz
  • 原文地址:https://www.cnblogs.com/qifeng1024/p/13596234.html
Copyright © 2020-2023  润新知