第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\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这个类中。

 关于类成员的疑问:

成员函数和成员变量都是隶属于具体对象的吗?

成员变量是隶属于具体对象的。成员函数是属于类的。所有的对象共享一套成员函数。

结论

程序示例:

编译运行结果如下:

成员函数都有一个隐含的参数this,this指针指向调用当前成员函数的对象的地址。每一个对象都有自己的一套成员变量,但是成员函数是共享的。成员函数可以直接访问对象的成员变量,因此,上述程序的第21行,我们在成员函数中直接访问t对象的成员变量是没有问题的。

成员函数只有一套,成员函数可以直接访问对应类的成员变量。

小结:

猜你喜欢

转载自www.cnblogs.com/wanmeishenghuo/p/9570014.html