C++ 构造函数与析构函数

基于菜鸟教程和课件的个人学习笔记

引言

C++的类有构造函数和析构函数用于初始化和清理对象 两个函数都会被自动调用,不自定义构造函数和析构函数,编译器会自动提供两个函数的空实现

构造函数&析构函数

  1. 构造函数:主要作用于创建函数时对对象成员的属性赋值
  2. 析构函数:主要作用于对象销毁前,执行清理工作(比如释放new开辟在堆区的空间)
  3. 构造函数和析构函数是一种特殊的公有成员函数,每一个类都有一个默认的构造函数和析构函数
  4. 构造函数在类定义时由系统自动调用,析构函数在类被销毁时由系统自动调用
  5. 构造函数的名称和类名相同,一个类可以有多个构造函数,不同的构造函数之间通过参数个数和参数类型来区
  6. 一个类只能有一个析构函数
  7. 可以在构造函数中给类分配资源,在类的析构函数中释放对应的资源
  8. 如果程序员没有提供构造和析构,系统会默认提供空实现
  9. 构造函数和析构函数,必须定义在public里面,才可以调用

构造函数

构造函数可用于为某些成员变量设置初始值 类的构造函数是类的一种特殊的成员函数,它会在每次创建类的新对象时执行

构造函数定义形式

构造函数的名称与类的名称是完全相同的,并且不会返回任何类型,也不会返回 void

1
类名(形参表);

例子

 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. 无参的构造函数和全缺省的构造函数都称为默认构造函数,并且默认构造函数只能有一个 无参构造函数、全缺省构造函数、我们没写编译器默认生成的构造函数,都可以认为是默认构造函数。(一般情况写全缺省)

无参数构造函数(默认构造函数)

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
~类名();

例子

 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;
}

析构函数特点

没有参数,不允许重载,一个类只能由一个析构函数

experience
使用 Hugo 构建
主题 StackJimmy 设计