个人主页:我们的五年

系列专栏:C++课程学习

欢迎大家点赞评论收藏⭐文章

 

 

目录

 1.默认成员函数的概念:

2.构造函数:

2.1特性:

2.2编译器自己生成的构造函数:

3.析构函数:

3.1概念:

3.2特性:


 

 前言:
在类和对象中篇,我们会讲解类的默认成员函数。类的默认成员函数总共有6个,但是最重要4个的是:构造函数,析构函数,拷贝构造函数,赋值运算符重载。本篇我们也是先来讲解前面两个函数:构造函数和析构函数。

 1.默认成员函数的概念:

当我们定义一个类,而没有显式实现,编译器就会按照它自己的规则生成6个默认成员函数。如果显式实现了,那编译器就不会自己生成。

所以就是是一个空类,里面最起码也是有6个默认成员函数的。

//空类

class Data{

};

2.构造函数:

2.1特性:

构造函数是特殊的函数,主要的任务不是开辟空间创建对象,而是初始化对象。

构造函数:

1.函数名和类名相同。

2.没有返回值。(不要写void)

3.实例化对象的时候,编译器自动调用。

4.构造函数可以重载。(无参时,不要写括号)

#include<iostream>
using namespace std;

class Data {
public:
	//没有返回值,名字与类名相同
	//没有返回值也不用写void
	Data() {
		cout << "Data()" << endl;
	}
	Data(int year, int month, int day) {
		cout << "Data(int year, int month, int day)" << endl;
	}
private:
	int _year;
	int _month;
	int _day;
};
int main()
{
	Data a;
	//Data a();   如果是无参的构造函数,不用写括号,写了()就变成函数声明了
	Data b(2024, 6, 10);
	return 0;
}

但是如果我们没有显式定义构造函数,编译器是会自动生成一个构造函数的。

2.2编译器自己生成的构造函数:

编译器自己生成的构造函数对内置类型(int  char int*)不做处理。其他的类,调用他们的构造函数。

下面的代码就是,我们定义一个Data,里面有其他的类A,那么实例化Data的时候,就回去调用A的构造函数

#include<iostream>
using namespace std;

class A {
public:
	A() {
		cout << "A()" << endl;
	}
};
class Data {

private:
	int _year;
	int _month;
	int _day;
	A a;
};
int main()
{
	Data a;
	return 0;
}

不管是内置类型,还是自定义类型。最终都是落到内置类型这一层面,所以如果成员类也没有写构造函数,那相当于所有的数据都没有进行舒适化。这样看来,好像编译器自己生成的构造函数一无是处。其实并不是这样的,如果我们定义的类里面的成员都是自定义类型,而且这些自定义类型我们都是自己写了显式构造函数的,那么我们就不要写构造函数,用编译器的就行。

#include<iostream>
using namespace std;
class A {
public:
	A() {
		_x = 1;
	}
private:
	int _x;
};
class Data {
private:
	A a;
	A b;
};
int main()
{
	Data a;
	return 0;
}
注意:C++11 中针对内置类型成员不初始化的缺陷,又打了补丁,即:内置类型成员变量在
类中声明时可以给默认值
#include<iostream>
using namespace std;
class Data {
private:
	int _year = 1900;
	int _month = 1;
	int _day = 1;
};
int main()
{
	Data a;
	return 0;
}

无参的构造函数,全缺省的构造函数,编译器自己生成的构造函数,都是默认构造函数。并且默认构造函数只能有一个,因为有多个,调用的时候就不知道去调用哪一个了。

3.析构函数:

3.1概念:

上面的构造函数不是去创造对象,而是去完成对象的初始化。析构函数也不是去完成对象的销毁,而是去完成资源的清理。

3.2特性:

析构函数也是特殊的成员函数,所以与普通的函数还是有一定的区别的。

1.名称是在类的名称前面加上~。

2.没有返回值,也没有参数。

3.因为没有参数,所以不能去重载。

4.生命结束的时候,会自动调用其析构函数。如果没有显式实现的时候,编译器也是会去生成析构的函数的,默认的析构函数对内置类型不做处理,但是对自定义类型会去调用他们的自己的析构函数。如果有其他的资源,比如动态申请了内存,那么就要自己去写析构函数。

#include<iostream>
using namespace std;
class Time {
public:
	Time() {
		cout << "Time()" << endl;
	}
	~Time() {
		cout << "~Time()" << endl;
	}
};
class Data {
private:
	int _year = 1900;
	int _month = 1;
	int _day = 1;
	Time a;
};
int main()
{
	Data a;
	return 0;
}

点赞(0) 打赏

评论列表 共有 0 条评论

暂无评论

微信公众账号

微信扫一扫加关注

发表
评论
返回
顶部