C++中的面向对象 02.深入探究类的初始化顺序

来源:互联网 发布:北外网络教育作业答案 编辑:程序博客网 时间:2024/06/12 00:43
#include <iostream>#include <stdio.h>using namespace std;class ABCD{public:    ABCD(int a, int b, int c)    {        this->a = a;        this->b = b;        this->c = c;        //调用顺序1.1        //调用顺序2.1        printf("ABCD() construct, a:%d,b:%d,c:%d  \n", this->a, this->b, this->c);    }    ~ABCD()    {        printf("~ABCD() destructor,a:%d,b:%d,c:%d  \n", this->a, this->b, this->c);    }    int getA()    {        return this->a;    }protected:private:    int a;    int b;    int c;};class MyE{public:    //调用顺序1.0   1,1在上面    MyE():abcd1(1,2,3),abcd2(4,5,6),m(100) //构造函数1,列表初始化    {        cout<<"MyD()"<<endl;//调用顺序1.2    }    ~MyE()    {        cout<<"~MyD()"<<endl;    }    //调用顺序2.0    MyE(const MyE & obj):abcd1(7,8,9),abcd2(10,11,12),m(101)  //拷贝构造函数2,也要加初始化列表    {        printf("MyD(const MyD & obj)\n");//调用顺序2.2    }protected:    //private: public:      ABCD abcd1; //c++编译器不知道如何构造abc1    ABCD abcd2;    const int m; //类成员中若有const修饰,必须在对象初始化的时候,给const int m 赋值。    static int count;//static修饰的变量或者函数,属于这个类,不属于具体的对象};int MyE::count  = 0;  //类中修饰的static修饰的变量或者函数,一定要在class的外面这样初始化//等于告诉编译器给我开辟内存。//调用顺序2.0int doThing( MyE mye1) //实参调用形参。调用拷贝构造函数{    //调用顺序3    printf("doThing() mye1.abc1.a:%d,m:%d\n", mye1.abcd1.getA(),mye1.m);  //此时a = 7; m = 101;    //实参传给形参的值是abcd1(1,2,3),abcd2(4,5,6),但它会执行abcd1(7,8,9),abcd2(10,11,12),m(100) ,                         return 0;}int main(){    MyE myE; //调用构造函数1    doThing(myE);      return 0;}

总结下:

  • 先部分后总体。也就是先将所有的零件初始化完了再初始化整体。
  • 类中包含其他类的成员函数时,可以使用初始化列表来分别初始化这些成员函数。先初始化别人再初始化自己;先析构自己再析构别人。
  • 如果类成员中有const成员,必须要在构造的时候初始化。
  • 如果类中有static成员,其实不属于这个类,属于全局,需要在外部初始化。
0 0
原创粉丝点击