C++面向对象程序设计(谭浩强)第三章第二~四节 学习笔记

2023-04-16 17:22:24 浏览数 (1)

3.2 利用析构函数进行清理工作

析构函数是与构造函数作用相反的函数。

当对象的生命周期结束时,会自动执行析构函数。

说明:

(1)如果在一个函数中定义了一个对象,当这个函数被调用结束时,对象应该释放,在对象释放前自动执行析构函数。

(2)静态(static)局部对象在函数调用结束时对象并不释放,因此也不调用析构函数,只在main函数结束或者调用exit函数结束程序时,才调用static局部对象的析构函数。

(3)全局对象在程序的流程离开其作用域时,调用该全局对象的析构函数。

(4)如果用new运算符动态地建立了一个对象,当用delete预算符释放该对象时,西安调用该对象的析构函数。

析构函数的作用并不是删除对象,而是在撤销对象占用的内存之前完成一些清理工作,使这部分内存可以被程序分配给新对象使用。析构函数不返回任何职,没有函数类型,也没有函数参数。由于没有函数参数,它不能被重载。一个类可以有多个构造函数,但是只能有一个析构函数。

析构函数是在声明类的时候定义的,析构函数可以完成类的设计者所指定的任何操作。

如果用户没有定义析构函数,C 编译系统会自动生成一个析构函数。(如果自定义析构函数什么也不干,也就没有了意义。)

代码语言:javascript复制
#include<iostream>
#include<string>
using namespace std;
class Student
{
public:
	Student(int n, string nam, char s)
	{
		num = n;
		name = nam;
		sex = s;
		cout << "Cc." << endl;
	}
	~Student()
	{
		cout << "Dc." << endl;
	}
	void display()
	{
		cout << "num:" << num << endl;
		cout << "name:" << name << endl;
		cout << "sex:" << sex << endl;
	}
private:
	int num;
	string name;
	char sex;
};
int main()
{
	Student stud1(1001, "huang", 'f');
	stud1.display();
	Student stud2(1002, "yao", 'm');
	stud2.display();
	return 0;
}

3.3调用构造函数和析构函数的顺序

调用析构函数的次序正好与调用构造函数的次序相反。

先构造的后析构,后构造的先析构。它相当于一个栈,先进后出。

归纳系统在什么时候调用够着函数和析构函数:

(1)若为全局对象,那么他的构造函数在本文件模板中的所有函数(包括main函数)执行之前调用。如果一个程序包含多个文件,而在不同的文件中都定义了全局对象,则这些对象的构造函数的执行顺序是不确定的。当main函数执行完毕或者调用exit函数时,调用析构函数。

(2)若为局部对象,则在建立对象时调用其构造函数。如果对象所在的函数被多次调用,则在每次建立对象时都要调用构造函数,在函数调用结束,对象释放时先调用析构函数。

(3)若为static局部对象,则只在程序第一次调用此函数定义对象时调用构造函数一次,在调用函数结束时对象并不释放,因此也不调用析构函数,只在main函数或调用exit函数结束程序时,才调用析构函数。  

 3.4对象数组

 数组可以由类对象组成。对象数组的每一个元素都是同类的对象。

在建立数组时,同样要调用构造函数。如果有50个元素,需要调用50次构造函数。在需要时可以在定义数组时提供实参以实现初始化。如果构造函数只有一个参数,在定义数组时可以直接在等号后面的花括号内提供实参。

Student stud[3]={60,70,80};

如果构造函数有多个参数,则不能在定义数组时直接提供所有参数。

编译系统只为每个对象元素的构造函数传递一个实参,所以在定义数组时提供的实参个数不能超过数组元素的个数。

构造函数有多个参数,在定义对象数组时应这样实现初始化:

在花括号中分别写出构造函数名并在括号内指定实参。

代码语言:javascript复制
Student Stud[3]={
    Student(11,12,13),
    Student(34,35,36),
    Student(98,97,09)
};

例题:计算和输出三个立方体的体积。

代码语言:javascript复制
#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
using namespace std;
//利用对象数组
class Box
{
public:
	Box(int c,int k,int g);
	int V_box();
private:
	int chang;
	int kuan;
	int gao;
};
Box::Box(int c,int k,int g)
{
	chang = c;
	kuan = k;
	gao = g;
}
int Box::V_box()
{
	return (chang* kuan* gao);
}

int main()
{
	Box box[3] = {
		Box(10,20,30),
		Box(11,22,33),
		Box(33,44,10)
	};
	cout << "V1=" << box[0].V_box() << endl;
	cout << "V2=" << box[1].V_box() << endl;
	cout << "V1=" << box[2].V_box() << endl;
	return 0;
}

0 人点赞