当前位置: 首页 > 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.jsqmd.com/news/905295/

相关文章:

  • 无损音乐下载神器:Qobuz-DL完整使用指南
  • 观察Taotoken平台旗舰模型更新速度与API服务稳定性的个人体验
  • 2026国产水质五参数在线监测仪十大品牌深度评测与选型实战指南 - 仪表品牌榜
  • 3分钟掌握免费AI图片高清修复:让模糊照片秒变清晰的专业工具
  • ThinkPad风扇终极控制指南:TPFanCtrl2让你的笔记本告别噪音烦恼
  • Relight项目核心技术剖析:LoRA微调在图像重照明中的应用
  • 基于Arduino与MAX7219的LED点阵时钟:从SPI驱动到3D打印外壳全解析
  • NPU加速实战:如何在华为昇腾平台上快速运行h2ogpt-gm-oasst1-en-2048-falcon-7b-v3模型
  • ControlNet-OpenPose-SDXL-1.0最佳实践:优化提示词与参数设置的7个秘诀
  • 干枯发质必入:高保湿发膜推荐TOP10 - 速递信息
  • BsMax:3D艺术家从Max/Maya迁移到Blender的终极指南
  • 通讯录扩展(计科实验一改进)
  • 从‘看不懂’到‘门儿清’:手把手教你读懂Linux性能监控命令的输出(附真实案例)
  • QiLink 社区核心共建者证书
  • Arduino自动驾驶模拟电路:从传感器协同到系统集成的嵌入式实践
  • 【全平台通杀!】小白必看:Win/Mac/Linux 都能用的 OpenClaw 安装指南(包含安装包)
  • 【AI 时代软件工程师的算法图谱】05 二分查找:在不确定性中定位边界
  • 终极Zotero SciHub插件:3步实现学术文献PDF自动下载
  • 基于nRF52832的无零线BLE智能开关改造方案详解
  • job-listing-relevance-model终极指南:从模型下载到生产部署全流程
  • 终极指南:如何用Universal x86 Tuning Utility一键解锁Intel/AMD硬件隐藏性能
  • Unlock-Music终极指南:免费解锁10+音乐平台加密格式的完整教程
  • 用Unity Tilemap复刻《超级马里奥》第一关:手把手教你搭建童年经典游戏场景
  • AI服务变现瓶颈突破,深度拆解Gemini客单价卡点与12个精准提价触点
  • 认识电子元器件 —— 存储器篇:参数、选型与应用
  • Hy-MT1.5-1.8B-2bit模型架构详解:从HunYuanDenseV1到SEQ量化
  • Nginx配置文件泄露实战:利用Python编码特性绕过URL过滤(附POC脚本)
  • Claude Code用户如何配置Taotoken以解决访问不稳定问题
  • 一文读懂EASI基准测试:SenseNova-SI-1.5-InternVL3-8B如何碾压开源竞品?
  • SpaceX 自研 AI 训练栈:适配 22 万 GPU 集群,大规模训练比 JAX 提速一个数量级以上