• c++——初始化列表


    多个对象构造和析构

    1对象初始化列表 

    1)对象初始化列表出现原因

    1.必须这样做:

    如果我们有一个类成员,它本身是一个类或者是一个结构,而且这个成员它只有一个带参数的构造函数,没有默认构造函数。这时要对这个类成员进行初始化,就必须调用这个类成员的带参数的构造函数,

    如果没有初始化列表,那么他将无法完成第一步,就会报错。

    2、类成员中若有const修饰,必须在对象初始化的时候,给const int m 赋值

    当类成员中含有一个const对象时,或者是一个引用时,他们也必须要通过成员初始化列表进行初始化,

    因为这两种对象要在声明后马上初始化,而在构造函数中,做的是对他们的赋值,这样是不被允许的。

    2)C++中提供初始化列表对成员变量进行初始化

    语法规则

    Constructor::Contructor() : m1(v1), m2(v1,v2), m3(v3)

    {

        // some other assignment operation

    }

    3)注意概念

    初始化:被初始化的对象正在创建

    赋值:被赋值的对象已经存在

    4)注意:

    成员变量的初始化顺序与声明的顺序相关,与在初始化列表中的顺序无关

    初始化列表先于构造函数的函数体执行

     1 #include <iostream>
     2 using namespace std;
     3 
     4 class A
     5 {
     6 public:
     7     A(int _a)
     8     {
     9         a = _a;
    10         cout << "构造函数" << "a" << a << endl;
    11     }
    12 
    13     ~A()
    14     {
    15         cout << "析构函数" << "a" << a << endl;
    16     }
    17 
    18 protected:
    19 private:
    20     int a;
    21 };
    22 
    23 
    24 //1 构造函数的初始化列表  解决: 在B类中 组合了一个 A类对象 (A类设计了构造函数)
    25 //根据构造函数的调用规则 设计A的构造函数, 必须要用;没有机会初始化A
    26 //新的语法  Constructor::Contructor() : m1(v1), m2(v1,v2), m3(v3)
    27 class B
    28 {
    29 public:
    30     B(int _b1, int _b2) : a1(1), a2(2), c(0)
    31     {
    32 
    33     }
    34 
    35     B(int _b1, int _b2, int m, int n) : a1(m), a2(n), c(0)
    36     {
    37         b1 = _b1;
    38         b2 = _b2;
    39         cout <<"B的构造函数"<<endl;
    40     }
    41     ~B()
    42     {
    43         cout<<"B的析构函数" <<endl;
    44     }
    45 
    46 protected:
    47 private:
    48     int b1;
    49     int b2;
    50     A a2;
    51     A a1;
    52     const int c;
    53 };
    54 
    55 
    56 //2 先执行 被组合对象的构造函数 
    57 //如果组合对象有多个,按照定义顺序, 而不是按照初始化列表的顺序
    58 
    59 //析构函数 : 和构造函数的调用顺序相反
    60 
    61 //3 被组合对象的构造顺序 与定义顺序有关系 ,与初始化列表的顺序没有关系.
    62 //4 初始化列表 用来 给const 属性赋值 
    63 void obj10play()
    64 {
    65     
    66     //A a1(10);
    67     //B ojbB(1, 2);
    68 
    69     //1参数传递 
    70     B ojbB2(1, 2,3, 4);
    71 
    72     //2 调用顺序
    73     
    74     return ;
    75 }
    76 
    77 void main100()
    78 {
    79     obj10play();
    80     system("pause");
    81 }
  • 相关阅读:
    HDOJ 2102 A计划(bfs)
    HDOJ 1226 超级密码(bfs)
    第一周——Photoshop软件的发展史,并说明其优缺点。
    第一周——Mobile Apps (手机应用)分析
    POJ 3090
    HDU 2824
    UVA 10673
    POJ 1061
    HDU 1358
    POJ 2406
  • 原文地址:https://www.cnblogs.com/long5683/p/9775161.html
Copyright © 2020-2023  润新知