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

C++构造与析构详解
本文详细解析了C++中构造函数与析构函数的工作原理及调用顺序。通过具体实例介绍了如何使用初始化列表来初始化类成员,并强调了const成员变量的初始化规则以及static成员的正确声明方式。
#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.0
int 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成员,其实不属于这个类,属于全局,需要在外部初始化。

转载于:https://my.oschina.net/HappyTeemo/blog/1558448

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值