基于菜鸟教程和课件的个人学习笔记
引言
C++的类有构造函数和析构函数用于初始化和清理对象
两个函数都会被自动调用,不自定义构造函数和析构函数,编译器会自动提供两个函数的空实现
构造函数&析构函数
- 构造函数:主要作用于创建函数时对对象成员的属性赋值
- 析构函数:主要作用于对象销毁前,执行清理工作(比如释放new开辟在堆区的空间)
- 构造函数和析构函数是一种特殊的公有成员函数,每一个类都有一个默认的构造函数和析构函数
- 构造函数在类定义时由系统自动调用,析构函数在类被销毁时由系统自动调用
- 构造函数的名称和类名相同,一个类可以有多个构造函数,不同的构造函数之间通过参数个数和参数类型来区
- 一个类只能有一个析构函数
- 可以在构造函数中给类分配资源,在类的析构函数中释放对应的资源
- 如果程序员没有提供构造和析构,系统会默认提供空实现
- 构造函数和析构函数,必须定义在public里面,才可以调用
构造函数
构造函数可用于为某些成员变量设置初始值
类的构造函数是类的一种特殊的成员函数,它会在每次创建类的新对象时执行
构造函数定义形式
构造函数的名称与类的名称是完全相同的,并且不会返回任何类型,也不会返回 void
例子
1
2
3
4
5
6
7
8
9
10
11
12
|
class complex {
public:
complex();//默认构造函数
complex(double,double);//初始化构造函数
complex(double);//强制转换构造函数
complex operator + (complex);//运算符重载
complex operator - (complex);//运算符重载
friend istream& operator >> (istream& , complex&);//istream类>>运算符重载
friend ostream& operator << (ostream& , complex&);//ostream类<<运算符重载
private:
double real , imag ;
};
|
构造函数特点
构造函数可以有参数,所以允许构造函数重载
无参构造函数与全缺省函数
- 全缺省构造函数和无参可能会在调用的时候出问题,并不是不可以同时存在(构成函数重载),而是调用出现歧义
- 无参的构造函数和全缺省的构造函数都称为默认构造函数,并且默认构造函数只能有一个
无参构造函数、全缺省构造函数、我们没写编译器默认生成的构造函数,都可以认为是默认构造函数。(一般情况写全缺省)
无参数构造函数(默认构造函数)
1
2
3
4
|
//类外实现
complex::complex() {
real = 0 ;imag = 0 ;
}
|
有参数构造函数(初始化构造函数)
括号内的名字为个人感悟所起
1
2
3
4
|
//类外实现
complex::complex(double r , double i ) {
real = r ; imag = i ;
}
|
有特殊语法规则
使用初始化列表来初始化字段
1
2
3
|
complex::complex(double r , double i ):real(r),imag(i) {
cout << "特殊语法规则,使用初始化列表来初始化字段" << endl ;
}
|
强制转换构造函数
1
2
3
4
5
6
7
8
9
10
11
12
|
//类外实现
complex::complex(double r ) {
real = r ; imag = 0 ;
}
//主函数内的调用
int main() {
complex c1(2.5,6.7) , c2(3.5,7.6) ;
complex c = c1+c2+complex(2.0) ;//强制转换的作用
cout << c ;
return 0 ;
}
|
析构函数
类的析构函数是类的一种特殊的成员函数,它会在每次删除所创建的对象时执行。
析构函数有助于在跳出程序(比如关闭文件、释放内存等)前释放资源
析构函数定义形式
析构函数的名称与类的名称是完全相同的,只是在前面加了个波浪号(~)作为前缀,它不会返回任何值,也不能带有任何参数
例子
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
class Student {
public:
void Print() {
cout << "学生姓名:" << _name << endl;
cout << "学生年龄:" << _age << endl;
cout << "学生学号:" << _ID << endl;
}
~Student() {//析构函数
cout << "~Student()" <<endl ;
}
private:
char _name[20];
int _age;
char _ID[20];
};
int main()
{
Student stu1;//调用默认构造函数
stu1.Print();
return 0;
}
|
析构函数特点
没有参数,不允许重载,一个类只能由一个析构函数