【C++】从入门到精通第二弹——类的构造与析构函数

这里写目录标题

写在最前面的话

------构造函数和析构函数是两个特殊的成员函数,都没有返回值,构造函数名和类名相同,析构函数名只是在类名前加上 ~

构造函数主要用来在创建对象时给对象中的数据成员赋值,主要目的是初始化对象,

析构函数的功能与构造函数正好相反,析构函数是用来释放对象的,再删出对象前,对对象进行清理工作。

类的构造函数

当建立一个类的对象时,构造函数就会默认被调用,如果用户不提供构造函数,编译器就会自动实现一个空的构造函数。所以构造函数的主要作用就是完成某些初始化的工作,一般来说,比如设置类成员属性操作,对成员数据赋值等

构造函数类内实现

cpp 复制代码
  1 #include<iostream>
  2 using namespace std;
  3 class Person
  4 {
  5     public:
  6         Person(int age, int height)
  7         {
  8             this->age = age;
  9             this->height = height;
 10         };
 11         void show()
 12         {
 13             cout<<"age = "<<age<<endl;
 14             cout<<"height = "<<height<<endl;
 15         }
 16     private:
 17         int age;
 18         int height;
 19 
 20 
 21 };
 22 
 23 
 24 int main()
 25 {
 26     Person p(45,123);
 27     p.show();
 28     
 29     return 0;
 30 }
~      

类外实现:

cpp 复制代码
  1 #include<iostream>
  2 using namespace std;
  3 class Person
  4 {
  5     public:
  6 /*        Person(int age, int height)
  7         {
  8             this->age = age;
  9             this->height = height;
 10         };*/
 11         Person(int age,int height);//注意一定要在类内先声明
 12         void show()
 13         {
 14             cout<<"age = "<<age<<endl;
 15             cout<<"height = "<<height<<endl;
 16         }
 17     private:
 18         int age;
 19         int height;
 20 
 21 
 22 };
 23 Person::Person(int age,int height)
 24 {
 25 
 26      this->age = age;
 27      this->height = height;
 28 }
 29 
 30 
 31 int main()
 32 {
 33     Person p(45,123);
 34     p.show();
 35 
 36     return 0;
 37 }

复制构造函数

cpp 复制代码
  1 #include<iostream>
  2 using namespace std;
  3 class Person
  4 {
  5     public:
  6 /*        Person(int age, int height)
  7         {
  8             this->age = age;
  9             this->height = height;
 10         };*/
 11         Person(int age,int height);//注意一定要在类内先声明
 			Person::Person(Person &pp);//复制构造函数
 12         void show()
 13         {
 14             cout<<"age = "<<age<<endl;
 15             cout<<"height = "<<height<<endl;
 16         }
 17     private:
 18         int age;
 19         int height;
 20 
 21 
 22 };
 23 Person::Person(int age,int height)
 24 {
 25 
 26      this->age = age;
 27      this->height = height;
 28 }
 29 Person::Person(Person &pp)
 30 {
      this->age = pp.age;
 	  this->height = pp.height;	
 
 	}
 int main()
  {
      Person p(45,123);
      p.show();
  	  Person pp(p);
  	  pp.show();
      return 0;
  }

注意:如果当用户忘记显示声明的默认构造函数,会导致链接出错,所以当我们使用自定义的默认构造函数时必须能实现,哪怕是空实现。

类的析构函数

cpp 复制代码
  1 #include<iostream>
  2 #include<string.h>
  3 using namespace std;
  4 class Person
  5 {
  6     public:
  7         Person();
  8         ~Person();
  9         void show();
 10         char* message;
 11 };
 12 Person::Person()
 13 {
 14 
 15     message = new char[1024];
 16 }
 17 void Person::show()
 18 {
 19     strcpy(message,"fsvfg");
 20 
 21     cout<<"message = "<<message<<endl;
 22 }
 23 Person::~Person()
 24 {
 25     delete []message;
 26 }
 27 int main()
 28 {
 29     Person p;
 30     p.show();
 31 
 32     return 0;
 33 }
 34 

注意:

一个类中只能出现一个析构函数

析构函数不能发生重载

不管是构造函数还是析构函数都不能使用return语句,没有返回值

在不同的环境下构造函数和析构函数调用规则如下:

自动变量的作用域是某个模块,当此模块被激活时,调用构造函数,当退出此模块时,调用析构函数。

全局变量在进入main函数之前调用构造函数,在程序终止时调用析构函数。

动态分配的对象在使用new为对象分配内存时调用构造函数,使用delete删除对象时调用析构函数。

临时变量是编译器为支持计算自动产生的,临时变量生存期的开始和结束点会调用构造函数和析构函数。

相关推荐
格林威1 天前
多相机微秒级对齐:硬件触发 vs PTP(IEEE 1588)方案实战对比
开发语言·人工智能·数码相机·机器学习·计算机视觉·视觉检测·机器视觉
初级代码游戏1 天前
iOS开发 Swift 速记2:三种集合类型 Array Set Dictionary
开发语言·ios·swift
蒙奇·D·路飞-1 天前
OpenClaw:开源的《合金弹头》精神续作与终极本地部署指南
c++·开源·mfc
峥嵘life1 天前
Android WiFi 热点 Channel 信道 和 Frequency 频率 转换总结
android·开发语言
小星星闪亮登场1 天前
2026萌新联赛第三场-- (郑州轻工业大学)
数据结构·c++·经验分享·算法·贪心算法·排序算法·深度优先
wgego1 天前
基础的反序列化一些总结(php和java)
java·开发语言·笔记
梓䈑1 天前
【用 Vibe Coding 实现的 C++17 在线判题系统】前端开发 + Web 自动化测试
前端·c++·ai编程
冻柠檬飞冰走茶1 天前
PTA基础编程题目集 7-8超速判断(C++语言实现)
开发语言·数据结构·c++·算法
TunerT_TQ1 天前
Valhalla 静态工程审阅 #018|MMCV 源码证据驱动评测【大厂开源基础设施特辑】
c++·开源·mfc·#计算机视觉·#商汤科技·#openmmlab·#静态源码审计
山峰哥1 天前
数据库工程与SQL调优:从慢查询到秒级响应的实战之路
java·开发语言·数据库·sql·深度优先·启发式算法