大家好,今天再次写c++的文章,首先给各位网友说明一下这段时间为啥都是写c++的文章,没有Linux的文章;原因是这样的,自己立了一个flag,八月份把c++的基本语法全部过完(目前完成三分之一),所以文章过程中我写的可能没有很详细的解释一些概念;所以文章中有不理解的地方,可以私聊我,我会尽力解答好。同时昨天遇到一位刚高考完的网友,人家都这么努力学习,你还打酱油吗?
一、对象的析构顺序:
在上一篇文章里面,已经介绍过对象的构造顺序,既然有对象的产生,那么就会有对象的消亡;换句话说,有资源的分配,最终系统就要收回这些分配出去的资源。所以也就有了对象的析构顺序用法了。下面我们来看一下对象析构顺序的分类,不过这里我们先来看构造对象调用构造函数的来引出对象析构的顺序:
(1)单个对象创建时构造函数的调用顺序:
调用父类的构造过程(这个概念暂时还没学,先不用管)
调用成员变量的构造函数(调用顺序与声明顺序相同)
调用类自身的构造函数
引出:析构函数与对应的构造函数的调用顺序相反,也就是对象构造与对象析构(消亡)的顺序相反。
(2)代码演示:
#include <stdio.h>
class Test{ const char * i; public: Test(const char *s) { printf("Test(const char *s) is %s",s); i=s; } ~Test() { printf("~Test() is %s",i); }};
class Test2{ Test mA; Test mB; public: Test2():mB("mB"),mA("mA") { printf("Test2()"); } ~Test2() { printf("~Test2()"); }};
Test gA("gA");
int main(){ Test2 t;
return 0;}
演示结果:
Test(const char *s) is gATest(const char *s) is mATest(const char *s) is mBTest2()~Test2()~Test() is mB~Test() is mA~Test() is gA
说明:从运行结果,我们可以看到先触发全局对象的构造函数,然后是触发初类Test2里面的mA和mB对象的构造函数,最后触发局部对象的构造函数,然后进行析构,我们可以看到,析构顺序完全和构造顺序相反。非常类似于栈的操作规则,栈是先入栈,却是最后出栈。
二、const关键字可以修饰类的对象嘛?
1、这个问题答案肯定是可以修饰的,为啥这么说呢?不知大家还是记得c语言里面的struct关键字不,在之前的文章里面也学习过,使用struct关键字也可以来构造类名,只不过他的所有成员都是公开的(public);换句大家好理解的话,就是结构体,那么在c语言里面,const关键字肯定是可以修饰结构体变量的,当然在c++里面肯定也是可以的,c++不是取代c语言的,而是对c语言进行扩展着,并且兼容c语言的。不过const修饰的对象有啥特性呢?
const修饰的对象特性:
const修饰的对象为只读对象
只读对象的成员变量不允许被改变
只读对象是编译阶段的概念,运行时无效
代码示例:
#include <stdio.h>
class Test{ int mi;public: int mj; Test(int i); Test(const Test& t); int getMi();};
Test::Test(int i){ mi = i;}
Test::Test(const Test& t){
}
int Test::getMi(){ return mi;}
int main(){
const Test t1(1);
t1.mj = 100; printf("the t1.mj is %d",t1.mj);
return 0;}
运行结果:
test.cpp: In function ‘int main()’:test.cpp:34:10: error: assignment of member ‘Test::mj’ in read-only object t1.mj = 100;
分析:我们可以看出public里面的属性mj是不能修改的,为只读的,因为类对象被const修饰了。