当前位置: 首页 > news >正文

C++:构造函数,析构函数详解

前言

上期了解C++类中有public、protected、private三种访问权限。

肯定会有人疑惑,C++为什么要设置这三个权限呢

本期内容就是围绕上面的问题展开说明

一、面向对象

开始的文章就提到过,类是(OOP)面向对象编程的基础

那么面向对象编程究竟是个什么东东呢

百度百科是这样解释的

通俗的来说就是利用代码将现实世界的事物抽象出来,使代码更具有真实事物的行为

简单举个栗子

狗是人类的朋友,有很多人养狗做宠物

宠物狗有名字,年龄,毛发颜色,等等特征

狗还会吃饭,喝水,汪汪汪之类的行为

如果利用代码抽象一个小狗类

这些名字,年龄等就对应成员变量

吃饭喝水等行为就是成员函数

上代码

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

classDog

{

protected:

intAge;

string Name;

string Color;

public:

voidEating()

{

cout <<"吃狗粮"<< endl;

}

voidDrinking()

{

cout <<"喝水水"<< endl;

}

voidWangwangwang()

{

cout <<"汪汪汪!!!"<< endl;

}

};

在现实世界中狗的名字我们可以改,但年龄和颜色我们是无法改变的,就比如狗的颜色是它本身DNA决定的。我们可以分辨颜色是因为我们视力没有问题,可以通过看的方式访问狗的颜色

所以我们通常在代码里将成员变量设置成protected属性

让外部无法直接访问,就像我们无法直接去看狗的DNA序列一样。

所以通常会定义一些成员函数来间接访问成员变量(这里上期讲解遗漏了,下面补充一下)

Protected和private无法在类外访问,但可以在自己的类内部被成员函数访问(对外接口)
而将这些成员函数放在public下,在类外使用这些成员函数,就相当于间接访问无法访问的变量
这就体现出C++面向对象中封装的特性

我们看看百度百科中对封装的介绍

简单 的说,外部使用一个封装好的类的时候只会考虑某些接口的特定功能,而并不会关心内部的具体实现细节。

具体看下图:

那么进入主题,看看封装的具体技术

二、构造函数

1.基本概念

基本概念:构造函数是类的成员函数,作用是在类创建对象时用于初始化对象。

特点:函数名和类名相同且不用写返回值,在创建对象时会自动调用。

语法:函数名( 形参列表 ){ 函数实现 }

注意:

1.构造函数不需要返回值类型

2.构造函数的函数名和类名相同

代码如下:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

classMyClass

{

protected:

inti;

charc;

string str;

public:

voidprint()//用于显示成员变量

{

cout <<"i = "<< i << endl;

cout <<"c = "<< c << endl;

cout <<"str = "<< str << endl;

}

MyClass()//构造函数

{

i = 5;

c ='a';

str ="str in MyClass";

}

};

voidtest()

{

//创建对象 cla

MyClass cla;

//调用 成员函数print

cla.print();

}

intmain()

{

test();

return0;

}

运行效果:

可见我们只是创建了一个对象,并没有对这个对象做任何操作。

我们不用自己调用构造函数,编译器在创建对象时自动调用构造函数,为变量初始化。

2.构造函数重载

1.构造函数分类

构造函数大概分无参构造、有参构造、拷贝构造三种

上述代码中的构造函数就是一个典型的无参构造

2.有参构造函数:

例如以下代码:(有参构造的3个重载)

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

MyClass(inti)

{

this->i = i;

}

MyClass(inti,charc)

{

this->i = i;

this->c = c;

}

MyClass(inti,charc,string str)

{

this->i = i;

this->c = c;

this->str = str;

}

3.有参构造函数3个调用规则:

括号法:

1

2

3

4

//使用有参构造函数创建对象 cla2,cla3,cla4

MyClass cla2(10);

MyClass cla3(10,'b');

MyClass cla4(10,'b',"str in MyClass_cla2");

等号法:

1

2

3

//使用有参构造函数创建对象(等号法)

MyClass cla5 = 10;

MyClass cla6 = (10,'b');

直接调用构造函数

1

2

3

4

//使用有参构造函数创建对象(调用构造函数)

MyClass cla7 = MyClass(10);

MyClass cla8 = MyClass(10,'b');

MyClass cla9 = MyClass(10,'b',"str in MyClass");

4.拷贝构造函数

1

2

3

4

5

6

MyClass(MyClass& cla)

{

this->i = cla.i;

this->c = cla.c;

this->str = cla.str;

}

注意:拷贝构造函数的形参是自身类型的引用

拷贝构造函数调用

1

2

3

//使用拷贝构造函数创建对象

MyClass cla11(cla8);

MyClass cla12 = cla9;

5.析构函数

基本概念:在对象被释放时编译器会自动调用析构函数,用于释放对象中变量的内存空间

语法:函数名( 形参列表 ){ 函数实现 }

注意:

1.构造函数不需要返回值类型

2.构造函数的函数名为 ~(类名)

特点:函数名和类名相同且不用写返回值,在创建对象时会自动调用。

有人会问,对象内存被释放时成员变量内存空间不是也被释放了吗


http://www.zskr.cn/news/1416589.html

相关文章:

  • Arduino综合实验:电位器同步控制直流电机与RGB LED
  • 从‘看不懂’到‘门儿清’:手把手教你读懂Linux性能监控命令的输出(附真实案例)
  • job-listing-relevance-model终极指南:从模型下载到生产部署全流程
  • 终极指南:如何用Universal x86 Tuning Utility一键解锁Intel/AMD硬件隐藏性能
  • 认识电子元器件 —— 存储器篇:参数、选型与应用
  • Nginx配置文件泄露实战:利用Python编码特性绕过URL过滤(附POC脚本)
  • Claude Code用户如何配置Taotoken以解决访问不稳定问题
  • SpaceX 自研 AI 训练栈:适配 22 万 GPU 集群,大规模训练比 JAX 提速一个数量级以上
  • 从根目录到Super分区:手把手带你认识安卓手机的系统‘地盘’(附精简系统实战)
  • Arduino与L298N驱动直流电机:PWM调速与H桥控制全解析
  • OpCore-Simplify:3步自动化配置黑苹果OpenCore EFI的终极方案
  • AtlasOS Windows性能优化架构设计与配置指南
  • 如何利用JUST-DUB-IT技术实现LTX-2.3-22b唇形同步的终极指南
  • 保姆级教程:手把手教你用Python为AWS DeepRacer 2018赛道写一个能跑进前10的奖励函数
  • XLM-RoBERTa多语言点击诱饵检测案例研究:实际应用场景与商业价值分析
  • Lean量化交易引擎:5大核心优势+零基础实战入门完整指南
  • 别再纠结了!手把手教你根据硬件和需求选ESXi、PVE还是unRaid(附保姆级避坑清单)
  • 2026年CODcr水质在线自动监测仪十大国产品牌深度测评:技术参数、实战表现与选型全解析 - 仪表品牌榜
  • 华为健康数据解放指南:3步将HiTrack转换为通用TCX格式
  • 保姆级教程:从下载ISO到配置网络,一步步在物理服务器上部署XCP-ng 8.2
  • 别再只盯着功能安全了!聊聊ISO 21448标准下,自动驾驶SOTIF的三大实战挑战与应对思路
  • ok-ww实战手册:基于视觉AI的鸣潮智能自动化全攻略
  • 告别命令行恐惧!Ubuntu 22.04下用GParted图形化无损调整分区大小(附保姆级截图)
  • 【企业级会议纪要SOP】:基于ISO 2023会议管理标准重构ChatGPT工作流,已验证27家500强落地有效性
  • 紧急预警:Claude v3.5部署后出现的3类静默降级现象,架构评审组已在27家头部客户中确认复现
  • 百度网盘macOS版SVIP功能破解完整指南:告别限速下载
  • ⑥ AI写作接单实战:公众号-小红书-知乎多平台内容变现
  • DiffusionNet实战:用PyTorch复现三维网格分类与分割(附完整代码与数据集)
  • 从零到一:OpCore-Simplify如何让黑苹果配置变得如此简单
  • 如何通过Python快速调用Taotoken平台上的多款大模型