构造与析构

C++自学精简教程 目录(必读)

1 构造函数

构造函数就是用类的名字作为函数名字的成员函数。

(1)一个类可以有多个构造函数
struct Student
{
    Student() {};//默认构造函数 default constructor
    Student(int age) {};//非默认构造函数
    Student(int age, bool sex) {};//非默认构造函数
};

int main()
{
    Student stu1;//调用默认构造函数
    Student stu2(10);//调用带一个整形参数的构造函数
    Student stu3(10, true);//调用两个参数的那个构造函数

    return 0;
}

(2) 编译器合成的默认构造函数

如果我们一个构造函数都没有定义,编译器也会为我们合成一个默认构造函数(default constructor)。

struct Student
{
};

int main()
{
    Student stu1;//调用编译器合成的默认构造函数(虽然我们没有看见那个函数在哪,编译器真是太热心了)

    return 0;
}

(3)禁止编译器合成默认构造函数

只要我们自己定义了构造函数,编译器就不会再多管闲事替我们热心的合成一个默认的构造函数了。

下面的类已经没有默认构造函数了,因为我们定义了非默认构造函数,编译器不再替我们合成,而我们自己也没有定义默认构造函数。

struct Student
{
    Student(int age) {};//非默认构造函数
    Student(int age, bool sex) {};//非默认构造函数
};

int main()
{
    Student stu2(10);//调用带一个整形参数的构造函数
    Student stu3(10, true);//调用两个参数的那个构造函数

    return 0;
}

这样的类也有一个不便之处,那就是像下面这样定义对象会报错:

因为没有默认构造函数,所以不能写 Studen stu; 这样的代码

如果要解决这个问题,就只能像一开始那样,自己显示的定义一个默认构造函数。

2 析构函数

2.1 类对象释放的时候会自动调用析构函数

#include <iostream>
using namespace std;

struct Student
{
	Student(void) {//默认构造函数:没有参数
		cout << "Student constructor called." << endl;
	}
	~Student(){//析构函数的执行是回收对象资源的最佳机会
		cout << "Student destructor called." << endl;
	}
};

int main()
{
	cout << "main begin" << endl;
	Student stu;//这里调用默认构造函数创建对象
	cout << "main end" << endl;
	return 0;
}//这里执行对象析构函数(对象超出作用域的时刻)

上述代码输出:

析构函数的执行

说明:大部分类并不需要定义析构函数。除非遇到非平凡的类

说明: 如果没有定义析构函数会怎么样?

如果没有定义析构函数,编译器会自动合成一个析构函数。编译器合成的析构函数是依次调用各个成员变量的析构函数。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

C++程序员Carea

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值