析构函数 对象数组 对象指针

简介: 🐰析构函数🌸析构函数的定义🌸析构函数的应用:🐰对象数组🐰指向对象的指针🌸对象指针的概念:🌸定义对象指针:🌸指向对象的数据成员的指针🌸指向对象的成员函数的指针

🚀🚀🚀大家觉不错的话,就恳求大家点点关注,点点小爱心,指点指点🚀🚀🚀

 

目录

🐰析构函数

🌸析构函数的定义

🌸析构函数的应用:

🐰对象数组

🐰指向对象的指针

🌸对象指针的概念:

🌸定义对象指针:

🌸指向对象的数据成员的指针

🌸指向对象的成员函数的指针


🐰析构函数

🌸析构函数的定义

析构函数的函数名是固定的,由波浪线~后跟类名构成。 析构函数没有返回值,也不接受参数。由于析构函数不接受参数,因此析构函数无法重载。一个类可以有多个构造函数,有且仅有一个析构函数。当一个类未定义自己的析构函数时,编译器会为他自动生成一个合成的析构函数。合成的析构函数函数体为空。

在一个析构函数中,首先执行函数体,然后析构成员,成员被初始化顺序的逆序析构(先构造后析构,后构造线析构)析构函数的作用并不是删除对象,而是在撤销对象占用的内存之前,完成一些清理工作。使这部分内存可以被程序分配给新对象使用。程序设计者要设计好析构函数,以完成所需的功能,只要对象的生命周期结束,程序就会自动执行析构函数来完成这些工作。

🌸析构函数的应用

无论何时一个对象被销毁,都会自动调用其析构函数

(1)对象再离开其作用域时被销毁

(2)当一个对象被销毁时,其成员函数被销毁。

(3)对于动态分配的对象,当对指向它的指针应用delete运算符时被销毁

(4)对于临时对象,当创建它的完整表达式结束时被销毁

注意:当指向对象的引用或指针离开作用域时,析构函数不会执行

1. class student
2. {
3. public:
4. student()
5.     {
6.         sno=200;
7.         sname="zhagsan";
8.     }
9. student(int a,string b)
10.     {
11.         sno=a;
12.         sname=b;
13.     };
14.     ~student();//析构函数的声明(记住析构函数没有返回类型,参数列表为空)
15. void setStudent();
16. void showStudent();
17. int Add();
18. 
19. private:
20. int sno;
21.     string sname;
22. 
23. };
24. void student::setStudent()
25. {
26.     cout<<"请输入学号和姓名"<<endl;
27.     cin>>sno>>sname;
28. }
29. void student::showStudent()
30. {
31.     cout<<sno<<' '<<sname<<' '<<endl;
32. }
33. int student::Add()
34. {
35. return sno;
36. }
37. student::~student()//析构函数的定义(类外定义函数一定加类名)
38. {
39.     cout<<"很好"<<"\n";
40. }

🐰对象数组

所谓对象数组,指每一个数组元素都是对象的数组,即若一个类有若干个对象,我们把这一系列的对象用一个数组来存放。对象数组的元素是对象,不仅具有数据成员,而且还有函数成员。

声明一个一维数组的格式如下:

      类名 数组名[常量表达式]

与基本数据类型的数组一样,在使用对象数组时也只能访问单个数组元素,其一般形式为:

       数组名[下标表达式].成员名

在建立数组时,需要对数组进行初始化。对象数组的初始化过程实际上就是调用构造函数对每一个元素对象进行初始化的过程。

注:当一个数组中的元素被删除时,系统也会调用析构函数,创建多少个对象,就会调用多少次构造函数

1. #include<iostream>
2. using namespace std;
3. class student
4. {
5. public:
6. void setstudent();
7. void showstudent();
8. private:
9. char id;
10.     string name;
11. };
12. void student::setstudent()
13. {
14.     cout<<"请输入学号和姓名"<<endl;
15.     cin>>id>>name;
16. }
17. void student::showstudent()
18. {
19.     cout<<"学号和姓名分别为"<<endl;
20.     cout<<id<<name<<endl;
21. }
22. int main()
23. {
24.     student s[3];//创建有三个对象的对象数组
25. for(int i=0;i<3;i++)
26.     {
27.         s[i].setstudent();
28.     }
29. for(int i=0;i<3;i++)
30.     {
31.         s[i].showstudent();
32.     }
33. }

🐰指向对象的指针

🌸对象指针的概念:

指针指向的是内存中对象所占用空间,对象在内存中的首地址称为对象的指针,用来保存对象的地址的指针变量称为指向对象的指针变量,简称指向对象的指针

🌸定义对象指针:

类名* 指针名

注意:对象指针访问其公共成员是使用"->",对象名访问公共成员时是使用"."

 

1. student s1;
2. student* p=&s1
3. p1->Add;

🌸指向对象的数据成员的指针

数据类型名* 指针名;

指针=&对象名.数据成员名

注意:这里的数据成员一定要是公共的

1. student s2;
2. int* p2;
3. p2=&s2.flag;

🌸指向对象的成员函数的指针

指向对象的普通函数的指针:

返回类型 (*指针名)(参数列表)

指针名=&函数名或者指针名=函数名;

(*指针名)(参数列表);

1. void Add()
2. {
3.     cout<<a+b<<endl;
4. }
5. 
6. void (*p3)();
7. p3=Add;//(1)
8. P3=&Add;//(2)
9. (1)(2)都是一样的,因为函数名就是函数的首地址,函数名前加&不影响

指向对象的成员函数的指针:

返回类型 (类名::*指针名)(参数列表)

指针名=&对象名.成员函数名;

指向对象成员函数的指针调用对象的成员函数:

(对象名.指针名)(参数列表)

1. student s4;
2. void (student::*p4)();
3. p4=&student::Add;
4. (s4.*p4)();

创建一个两数之和的类

1. #include<iostream>
2. using namespace std;
3. class student
4. {
5. public:
6. student()
7.     {
8.         a=1;
9.         b=1;
10.     }
11. student(int x,int y)
12.     {
13.         a=x;
14.         b=y;
15.     };
16. void Add();
17. int flag=1;
18. private:
19. int a;
20. int b;
21. 
22. };
23. void student::Add()
24. {
25.     cout<<a+b<<endl;
26. }
27. //普通函数
28. void Add(int x,int y)
29. {
30.     cout<<x+y<<endl;
31. }
32. int main()
33. {
34. //对象指针
35. student s1(1,6);
36.     student* p1=&s1;
37.     p1->Add();
38. //对象数据成员指针
39. student s2(1,6);
40. int *p2;
41.     p2=&s2.flag;
42. //普通函数指指针
43. void (*p3)(int,int);
44.     p3=Add;
45. //普通函数指针调用函数
46.     (*p3)(3,5);
47. 
48. //成员函数指针
49.     student s4={1,3};
50. void (student::*p4)();
51.     p4=&student::Add;
52. //成员函数指针调用函数
53.     (s4.*p4)();
54. }

🌸🌸🌸如果大家还有不懂或者建议都可以发在评论区,我们共同探讨,共同学习,共同进步。谢谢大家! 🌸🌸🌸  



相关文章
|
1月前
使用指针访问数组元素
【10月更文挑战第30天】使用指针访问数组元素。
37 3
|
24天前
|
存储 程序员 编译器
C 语言数组与指针的深度剖析与应用
在C语言中,数组与指针是核心概念,二者既独立又紧密相连。数组是在连续内存中存储相同类型数据的结构,而指针则存储内存地址,二者结合可在数据处理、函数传参等方面发挥巨大作用。掌握它们的特性和关系,对于优化程序性能、灵活处理数据结构至关重要。
|
28天前
|
存储 C语言 计算机视觉
在C语言中指针数组和数组指针在动态内存分配中的应用
在C语言中,指针数组和数组指针均可用于动态内存分配。指针数组是数组的每个元素都是指针,可用于指向多个动态分配的内存块;数组指针则指向一个数组,可动态分配和管理大型数据结构。两者结合使用,灵活高效地管理内存。
|
28天前
|
容器
在使用指针数组进行动态内存分配时,如何避免内存泄漏
在使用指针数组进行动态内存分配时,避免内存泄漏的关键在于确保每个分配的内存块都能被正确释放。具体做法包括:1. 分配后立即检查是否成功;2. 使用完成后及时释放内存;3. 避免重复释放同一内存地址;4. 尽量使用智能指针或容器类管理内存。
|
28天前
|
存储 NoSQL 编译器
C 语言中指针数组与数组指针的辨析与应用
在C语言中,指针数组和数组指针是两个容易混淆但用途不同的概念。指针数组是一个数组,其元素是指针类型;而数组指针是指向数组的指针。两者在声明、使用及内存布局上各有特点,正确理解它们有助于更高效地编程。
|
1月前
|
存储 人工智能 算法
数据结构实验之C 语言的函数数组指针结构体知识
本实验旨在复习C语言中的函数、数组、指针、结构体与共用体等核心概念,并通过具体编程任务加深理解。任务包括输出100以内所有素数、逆序排列一维数组、查找二维数组中的鞍点、利用指针输出二维数组元素,以及使用结构体和共用体处理教师与学生信息。每个任务不仅强化了基本语法的应用,还涉及到了算法逻辑的设计与优化。实验结果显示,学生能够有效掌握并运用这些知识完成指定任务。
53 4
|
1月前
|
存储 编译器 Linux
【c++】类和对象(上)(类的定义格式、访问限定符、类域、类的实例化、对象的内存大小、this指针)
本文介绍了C++中的类和对象,包括类的概念、定义格式、访问限定符、类域、对象的创建及内存大小、以及this指针。通过示例代码详细解释了类的定义、成员函数和成员变量的作用,以及如何使用访问限定符控制成员的访问权限。此外,还讨论了对象的内存分配规则和this指针的使用场景,帮助读者深入理解面向对象编程的核心概念。
89 4
|
1月前
使用指针访问数组元素
【10月更文挑战第31天】使用指针访问数组元素。
48 2
|
1月前
|
算法 索引
单链表题+数组题(快慢指针和左右指针)
单链表题+数组题(快慢指针和左右指针)
39 1
|
2月前
|
存储
如何使用指针数组来实现动态二维数组
指针数组可以用来实现动态二维数组。首先,定义一个指向指针的指针变量,并使用 `malloc` 为它分配内存,然后为每个子数组分配内存。通过这种方式,可以灵活地创建和管理不同大小的二维数组。