zoukankan      html  css  js  c++  java
  • 第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对象的成员变量是没有问题的。

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

    小结:

  • 相关阅读:
    基于html2canvas实现网页保存为图片及图片清晰度优化
    玩转 React(四)- 创造一个新的 HTML 标签
    浅谈前后端分离与实践(一)
    javascript新手实例1-DOM基本操作
    一个看一次就永远不会忘的windows环境开发小技巧
    细说Web API中的Blob
    所见即所得,实现一个有趣的动画效果
    带你玩转prefetch, preload, dns-prefetch,defer和async
    Hologres+Flink流批一体首次落地4982亿背后的营销分析大屏
    浏览器报错:ERR_PROXY_CONNECTION_FAILED的解决方法
  • 原文地址:https://www.cnblogs.com/wanmeishenghuo/p/9570014.html
Copyright © 2011-2022 走看看