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

     关于类成员的疑问:

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

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

    结论

    程序示例:

    编译运行结果如下:

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

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

    小结:

  • 相关阅读:
    一个在线的C++帮助文档网站
    linux 学习笔记 (四)
    类的static成员函数和const成员函数
    Linux的inode、软链接、硬链接
    常用linux命令(三)
    多语言调用之 C++ 调用 Java JNI
    多语言调用之 Java调用C/C++
    NHibernate 操作原生SQL以及查询DataTable,DataSet
    DataGridView控件用法合集
    Java AOP实战 寻找SQL的引用路径
  • 原文地址:https://www.cnblogs.com/wanmeishenghuo/p/9570014.html
Copyright © 2020-2023  润新知