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

C++中的六个函数

一、构造函数

在C++中,构造函数是六个函数中的第一个,当一个对象被创建时,在它的整个周期中,是一个由生到死的过程,即构造函数创建对象,析构函数析构对象。在对象被创建时,调用构造函数创建一个对象,这是对象的创建过程。在C++中,当你创建一个对象时需要调用构造函数创建对象,在类中,有默认的构造函数,当然你也可以去使用构造函数去创建对象,对数据进行初始化。看下面的例子:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

classBase

{

public:

Base()

{}

Base(inta=0):num(a)

{}

Base(inta=0,intb=0):num(a),age(b)

{}

Base(inta=0,intb=0,doublec=0.0):num(a),age(b),slaroy(c)

{}

private:

intnum;

intage;

doubleslaroy;

};

在上面的构造函数中,构造函数必须与类名相同,构造函数是无类型的,第一个构造函数是默认的构造函数,第二个构造函数是只对一个数据成员进行初始化,其它的数据成员是随机值。第二个构造函数是对两个数据成员进行初始化,其它的数据成员为随机值。第三个构造函数是对所有的数据成员进行初始化。

二、析构函数

在C++中,构造函数是创建一个对象时,那么析构函数则是这个对象由生到死的死亡过程。同时析构函数也在析构对象时可以将已经分配的内存空间进行回收。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

classBase

{

public:

Base()

{}

Base()

{

p=newchar[strlen("default")+1];

strcpy(p,"default");

}

~Base()

{

if(p != NULL)

{

delete[] p;

p=NULL;

}

}

private:

char*p;

};

析构函数如上所示,它无类型、无参数、无返回值,如果在构造对象时没有进行空间的开辟内存的分配时,那么

析构函数如同默认的析构函数一样,如果进行了内存的分配时,当一个对象被析构时同时还要对其所分配的内存进行回收,否则就会造成内存泄漏。

三、拷贝构造函数

在C++中,如果在构造函数中有申请内存的操作,且在其他函数中出现对象的拷贝,那么就会需要拷贝构造函数。

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

classBase

{

public:

Base()

{}

Base()

{

p=newchar[strlen("default")+1];

strcpy(p,"default");

}

Base(constBase &s)

{

p=newchar[strlen(s.p)+1];

strcpy(p,s.p);

}

~Base()

{

if(p != NULL)

{

delete[] p;

p=NULL;

}

}

private:

char*p;

};

intmain()

{

Base a;

Base b(a);

return0;

}

由于在主函数中出现了对对象的拷贝赋值,那么就需要拷贝构造函数,如果没有拷贝构造函数,则会使用默认的

拷贝构造函数,那么此时进行的是浅拷贝,那么会产生析构函数对内存重复释放的错误。那么此时就需要进行深拷贝

操作,重新编写拷贝构造函数对对象进行拷贝赋值。而在编写拷贝构造函数时要注意参数必须是“&”引用传递,否则

则是语法错误。

四、赋值函数

在C++中,赋值函数为第四个函数,如果在构造函数中有申请内存的操作,且在其他程序中有两个对象直接或间接

进行赋值操作,就需要赋值函数。

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

33

34

35

36

37

38

39

40

41

42

classBase

{

public:

Base()

{}

Base()

{

p=newchar[strlen("default")+1];

strcpy(p,"default");

}

Base(constBase &s)

{

p=newchar[strlen(s.p)+1];

strcpy(p,s.p);

}

Base& operator=(constBase &s)

{

if(&s==this)

return*this;

delete[] p;

p=newchar[strlen(s.p)+1];

strcpy(p,s.p);

return*this;

}

~Base()

{

if(p != NULL)

{

delete[] p;

p=NULL;

}

}

private:

char*p;

};

intmain()

{

Base a,c;

Base b(a);

c=a;

return0;

}

由于在主函数中进行了对象的赋值操作,如果没有对“=”运算符进行重载定义,则会产生两次释放同一个内存的

操作的错误。在“=”重载操作中,如果涉及到指针操作,则必须判断两个对象是否为同一个对象即自赋值操作,否则

当进行释放指针的操作时,就可能产生错误。然后要用delete释放原有的内存资源,否则将造成内存泄漏。

五、对一般对象的取址函数

在C++中,对一般对象的取址函数为第五个函数。

1

2

3

4

5

6

7

8

classBase

{

public:

Base* operator&()

{

returnthis;

}

};

在一般对象的取址函数是直接返回该对象的地址,则为取其地址。

六、对常对象的取址函数

在C++中,对常对象的取址函数为第六个函数。

1

2

3

4

5

6

7

8

classBase

{

public:

constBase* operator&()const

{

returnthis;

}

};

复制讲解

在常对象的取址函数也是直接返回该常对象的地址,则为取其地址


http://www.jsqmd.com/news/855504/

相关文章:

  • 2026年质量好的标识标牌高口碑品牌推荐 - 品牌宣传支持者
  • AI 写后端:如何让 AI 守住 Controller、Service、Mapper 的边界
  • 2026年新房墙面装修厂家性价比排行实测对比 - 优质品牌商家
  • 第一层级评论区正常
  • 2026中医养生馆厂家选型推荐:技术与服务核心维度解析 - 优质品牌商家
  • 从Linux内核到Android相机:手把手拆解V4L2框架的五个核心结构体
  • Python,Go,Rust开发企业上市流程培训库App
  • i.MX8M Plus调试问题:JTAG_MOD信号处理与解决方案
  • 乐山汽车低趴改装技术全解析:乐山汽车灯光改装/乐山汽车电器维修/乐山汽车维修保养/靠谱品牌筛选推荐 - 优质品牌商家
  • 答辩ppt模板资源合集
  • 2026年帝医时珍熏蒸权威品牌技术实力深度解析:东方熏道熏蒸/中医养生加盟/中药熏蒸太空舱/中药熏蒸床/优选指南 - 优质品牌商家
  • 只有被坑过才能真正懂,那AI行么?
  • 2026年比较好的成都标识标牌厂家哪家好 - 行业平台推荐
  • 我因为偶然的原因搞出来了---------可以不限层级的评论区
  • AI工具大概率会加剧芯片行业的“强者越强“效应,而不会拉平差距(6000字)
  • 2026年Q2专业电气设备检测可靠企业排行及解析 - 优质品牌商家
  • 实例讲解什么是上下文治理
  • XSLT 元素
  • 标准单元LVS验证:特殊处理策略与Calibre实战指南
  • AI越反思越蠢:我们可能把Agent的“长期记忆“做反了
  • 数组的创建方式
  • 从缺页异常看Linux内存管理的基石:写时复制、延迟分配与交换机制
  • CSS视图过渡(View Transitions)完全指南:打造流畅页面切换
  • 成都连砂石技术选型推荐及本地合规供应厂家解析 - 优质品牌商家
  • 高效学习W55MH32嵌入式芯片:从零到一的实战路径与调试心法
  • [特殊字符] OpenClaw 2.7.5 连接 Ollama 本地模型教程 [特殊字符]
  • 现在的这个软件我比较有自信了
  • 分布式电商爬虫架构:Scrapy-Redis+消息队列的集群部署
  • 戴家场镇靠谱的换电瓶哪家靠谱
  • TVBOX最新电视直播软件tv版下载与安装教程