c++——构造和析构函数

概述

构造函数和析构函数,这两个函数将会被编译器自动调用;
构造函数完成对象的初始化动作,析构函数在对象结束的时候完成清理工作。
注意:
对象的初始化和清理工作是编译器强制我们要做的事情,即使你不提供初始化操作和清理操作,编译器也会给你增加默认的操作,只是这个默认初始化操作不会做任何事。

构造函数:实例化对象的时候系统自动调用
析构函数:对象释放的时候系统自动调用

定义

构造函数语法:
构造函数函数名和类名相同,没有返回类型,连void都不可以,但可以有参数,可以重载

析构函数语法:
析构函数函数名是在类名前面加”~”组成,没有返回类型,连void都不可以,不能有参数,不能重载

构造函数的分类以及调用

构造函数分类:

按参数类型:分为无参构造函数和有参构造函数
按类型分类:普通构造函数和拷贝构造函数(复制构造函数)

构造函数的调用

class Data
{
private:
    int num;
public:
    Data()
    {
        num = 0;
        cout << "无参构造函数" <<"num = "<< num<< endl;
    }
    Data(int n)
    {
        num = n;
        cout << "有参构造函数" <<"num = "<< num<< endl;
    }
    ~Data()//析构函数(没有返回值类型 没有参数 不能重载)
    {
        cout << "析构函数" <<"num = "<< num<< endl;
    }
};

void test0()
{
    Data ob0;
    Data ob1(10);
}
void test1()
{
    Data ob2;//隐式无参调用 默认构造
    Data ob3 = Data();//显式无参调用

    Data ob4(10);//隐式有参调用
    Data ob5 = Data(10);//显式有参调用

    Data ob6 = 30;//隐式转换 转换为 Data ob6(30);

    Data(20);//隐匿对象(当前语句结束 隐匿对象立即释放)
    cout << "*********" <<endl;
}

在同一作用域 构造与析构的顺序相反

拷贝构造函数

系统提供一个拷贝构造函数 赋值操作

//拷贝构造函数
Data(const Data &ob)//const Data &ob = ob1
{
    //拷贝构造函数 是ob2调用 num就是ob2的num
    //ob2.num = ob1.num
    num = ob.num;
    cout<<"拷贝构造"<<endl;
}
class Data
{
private:
    int num;
public:
    int getNum(void)
    {
        return num;
    }

    Data()
    {
        num = 0;
        cout << "无参构建 num="<< num <<endl;
    }
    Data(int n)
    {
        num = n;
        cout << "有参构建 num="<< num << endl;
    }
    ~Data()
    {
        cout << "析构函数 num="<< num << endl;
    }
    Data(const Data &ob)
    {
        num = ob.num;
        cout << "拷贝构造"<< endl;
    }
};
void test0()
{
    Data ob0(10);

    Data ob1(ob0);//隐式调用拷贝构造函数
    cout << "ob1.num = "<<ob1.getNum() << endl;

    Data ob2 = Data(ob0);//显式调用拷贝构造函数
    cout << "ob2.num = "<<ob2.getNum() << endl;

    Data ob3 = ob0;//隐式转换调用
    cout << "ob3.num = "<<ob3.getNum() << endl;
}

运行结果:
在这里插入图片描述
旧对象 初始化 新对象 才会调用拷贝构造函数

Data ob1(10);

Data ob2(ob1);//拷贝构造
Data ob3 = Data(ob1);//拷贝构造
Data ob4 = ob1;//拷贝构造函数
Data ob5;
ob5 = ob1;//不会调用拷贝构造 单纯对象赋值操作
拷贝构造函数注意事项

1.不能调用拷贝构造函数去初始化匿名对象,也就是说以下代码不正确

void test()
{
	Data ob1(10);//有参构造
	//err
	//Data(ob1);  //Data(ob1)==>Data ob1; ob1重定义
}

2.对象作为函数的参数 如果实参与形参 都是普通对象 那么就会调用拷贝构造

void myPrintData(Data ob) // Data ob = ob1;
{
	cout << "num = "<< ob.num<<endl;
}
void test()
{
	Data ob1(10);

	myPrintData(ob1);
}

3.函数返回局部对象 在qt中会被优化 从而调用不了拷贝构造

构造函数的调用规则

系统会对任何一个类提供3个函数成员函数:
默认构造函数(空) 默认析构函数(空) 默认拷贝构造函数(浅拷贝)
1、如果用户提供了有参构造 将屏蔽 系统的默认构造函数。
2、如果用户提供了有参构造 不会屏蔽 系统的默认拷贝构造函数。
3、如果用户提供了拷贝构造函数 将屏蔽 系统的默认构造函数、默认拷贝构造函数。

总结

对于构造函数:用户一般要实现:无参构造、有参构造、拷贝构造、析构。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值