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

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

时间: 2024-08-04 08:45:34

第24课 经典问题解析二的相关文章

第67课 经典问题解析五

1. 指针的判别 (1)拾遗 ①C++中仍然支持C语言中的可变参数函数 ②C++编译器的匹配调用优先级:重载函数>函数模板>变参函数 (2)思路 ①将变量分为两类:指针 VS 非指针 ②编写函数: 指针变量调用时回true 非指针变量调用时返回false (3)函数模板与变参函数的化学反应 template<typename T> //优先匹配函数模板 bool IsPtr(T* v) // match pointer { return true; } //变参函数 //再匹配变参

第55课 经典问题解析(四)

1. 关于动态内存分配 (1)new和malloc的区别 区别 new malloc 是否是关键字 关键字,是C++的一部分.被所有的C++编译器支持. 由C库提供的函数,注意是函数,而不是关键字,要依赖C库(cstdlib),在某些系统开发(如嵌入式)中可能不能调用. 分配单位 以具体类型为单位 以字节为单位 内存初始化 申请时可进行初始化 仅根据需要申请定量的内存,但并不进行初始化. 是否触发构造函数的调用 会触发.对象的创建只能使用new 不会,仅分配需要的内存空间,因此不适合面向对象开发

经典问题解析二(十九)

今天我们来探讨下当程序中存在多个对象时,如何确定这些对象的析构顺序?那么单个对象创建时构造函数的调用顺序是:a> 调用父类的构造过程(我们会在后面进行讲解):b> 调用成员变量的构造函数(调用顺序与生命顺序相同):c> 调用类自身的构造函数.析构函数与对应构造函数的调用顺序相反.当多个对象析构时,析构顺序与构造顺序相反. 下来我们以代码为例进行说明 #include <stdio.h> class Member {     const char* ms; public:   

C++--第24课 - 专题四经典问题解析

第24课 - 专题四经典问题解析 1. 历史的痕迹 #include <cstdlib> #include <iostream> using namespace std; template<class T>  //以前是用typename定义,现在是用class定义 T Minus(T a, T b) { return a - b; } template<class T>  //类模板 class Add { public: T add(T a, T b)

C++--第14课 - 专题二经典问题解析

第14课 - 专题二经典问题解析 1. malloc与free和new与delete有什么区别? malloc和free是函数,new和delete是关键字. #include <cstdlib> #include <iostream> using namespace std; class Test { private: int i; public: Test() { cout<<"Test()"<<endl; i = 0; } Test

24点经典算法

1.概述 给定4个整数,当中每一个数字仅仅能使用一次:随意使用 + - * / ( ) ,构造出一个表达式,使得终于结果为24,这就是常见的算24点的游戏.这方面的程序非常多,一般都是穷举求解.本文介绍一种典型的算24点的程序算法,并给出两个详细的算24点的程序:一个是面向过程的C实现,一个是面向对象的java实现. 2.基本原理 基本原理是穷举4个整数全部可能的表达式,然后对表达式求值. 表达式的定义: expression = (expression|number) operator (ex

Excel Power Query经典应用之二维表转一维表

Excel Power Query经典应用之二维表转一维表 将一个二维表格转为一维表格,是我们经常要做的事,目的是为了将数据做更好的分析.但Excel普通的转换的方式却比较麻烦.不过不用担心.利用Excel的Power Query功能,可以实现秒转. 了解更多新技能,扫描关注微信公众号 大话office

ZXing解析二维码

上一篇文件已经说过如何用ZXing进行生成二维码和带图片的二维码,下面说下如何解析二维码 二维码的解析和生成类似,也可以参考google的一个操作类 BufferedImageLuminanceSource类,该类可在google的测试包中找到,另外j2se中也有该类,你可以将该类直接拷贝到源码中使用,你也可以自己写个. import java.awt.Graphics2D; import java.awt.geom.AffineTransform; import java.awt.image.

Java使用QRCode.jar生成与解析二维码

正题:Java使用QRCode.jar生成与解析二维码demo 欢迎新手共勉,大神监督指正 # 不知道QRCode的请移步wiki,自行了解,这里不多做解释 *******创建二维码之前的工作******** 去下面给出的地址下载QRCode.jar包,此jar包已经包括 生成与解析 . 官网下载到的jar包是没有解析的 https://files.cnblogs.com/files/bigroc/QRCode.zip ***创建好你的测试类导好jar包开始吧*** 第一部分:生成二维码 pac