第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课 经典问题解析二的主要内容,如果未能解决你的问题,请参考以下文章