第24课 经典问题解析二

Posted wanmeishenghuo

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了第24课 经典问题解析二相关的知识,希望对你有一定的参考价值。

关于析构的疑问:

当程序中存在多个对象的时候,如何确定这些对象的析构顺序?

技术分享图片

 

 

多个对象析构时,析构顺序与构造顺序相反。

假设构造三个对象a、b、c,则程序结束时,析构顺序为c、b、a。

程序示例:

 1 #include <stdio.h>
 2 
 3 class Member
 4 {
 5     const char* ms;
 6 public:
 7     Member(const char* s)
 8     {
 9         printf("Member(const char* s): %s
", s);
10         
11         ms = s;
12     }
13     ~Member()
14     {
15         printf("~Member(): %s
", ms);
16     }
17 };
18 
19 class Test
20 {
21     Member mA;
22     Member mB;
23 public:
24     Test() : mB("mB"), mA("mA")
25     {
26         printf("Test()
");
27     }
28     ~Test()
29     {
30         printf("~Test()
");
31     }
32 };
33 
34 Member gA("gA");
35 
36 int main()
37 {
38     Test t;
39     
40     return 0;
41 }

首先构造全局对象gA,然后mA、mB,最后Test本身,析构顺序相反。

运行结果如下:

技术分享图片

 

关于析构的答案:

技术分享图片

 

关于const对象的疑问:

const关键字能否修饰类的对象,如果可以,有什么特性?

技术分享图片

技术分享图片

const成员函数的定义:

技术分享图片

 

 

 示例程序:

技术分享图片

const对象直接修改mj的值,编译报错如下:

技术分享图片

 

在主程序中调用getMi,编译如下:

技术分享图片

 

给getMi加上const属性,声明和定义都要加上,如下:

技术分享图片

这样程序就能正常编译和运行了。

const成员函数的意义在于在它的内部是不能修改成员变量的值的。

去掉getMi的const属性,在拷贝构造函数中调用getMi,如下:

技术分享图片

第20行我们直接调用了getMi,编译结果如下:

技术分享图片

 

 这是因为第18行的Test对象是const的,只能调用const成员函数。

在工程开发中只有很少的情况会使用const对象。

技术分享图片

第30行将t的const属性去掉,getMi的属性也去掉,在第20行,我们一般直接用t对象来引用它的成员,而不是通过成员函数做一个转接。即使mi是private的,在第20行这种情况下也是可以直接调用的,因为这时我们处于Test这个类中。

 

以上是关于第24课 经典问题解析二的主要内容,如果未能解决你的问题,请参考以下文章

C++--第14课 - 专题二经典问题解析

第12课 经典问题解析一

第55课 经典问题解析

第五十五课经典问题解析四

第六十七课经典问题解析五

Hadoop深入浅出实战经典视频教程(共22讲)