码迷,mamicode.com
首页 > 其他好文 > 详细

第24课 经典问题解析二

时间:2018-09-01 14:04:53      阅读:149      评论:0      收藏:0      [点我收藏+]

标签:spl   ber   声明   png   而不是   析构顺序   编译   const成员函数   col   

关于析构的疑问:

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

技术分享图片

 

 

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

假设构造三个对象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\n", s);
10         
11         ms = s;
12     }
13     ~Member()
14     {
15         printf("~Member(): %s\n", 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()\n");
27     }
28     ~Test()
29     {
30         printf("~Test()\n");
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课 经典问题解析二

标签:spl   ber   声明   png   而不是   析构顺序   编译   const成员函数   col   

原文地址:https://www.cnblogs.com/wanmeishenghuo/p/9570014.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!