C++学习笔记(7)----类的数组中构造函数和析构函数的调用顺序
C++类的数组中构造函数和析构函数的调用顺序(2)
对于如下的代码:
#include<iostream>
using namespace std;
class CBase {
private:
static int count;
public:
int id;
public:
CBase() {
id = CBase::count++;
cout << "CBase():Constructor:" <<id<< endl;
}
~CBase() {
cout << "CBase(): Destructor:" <<id<< endl;
}
};
int CBase::count = 0;//类的静态变量必须在类外以这样的方式进行初始化,否则会出现连接错误
class CDerive :public CBase {
public:
CDerive() {
cout << "CDerive():Constructor:" << id<<endl;
}
~CDerive() {
cout << "CDerive(): Destructor:" <<id<< endl;
}
};
int main(int argc, char* argv[])
{
CDerive p[3];
cout << "p[0].id=" << p[0].id << endl;
cout << "p[1].id=" << p[1].id << endl;
cout << "p[2].id=" << p[2].id << endl;
cout << "&p[0]=" << &p[0] << endl
<< "&p[1]=" << &p[1] << endl
<< "&p[2]=" << &p[2] << endl;
return 0;
//当函数退出时,栈中的类的实例会自动调用析构函数,我们通过此例来查看它们调用的顺序
}
运行结果如下:
S:\ComputerTech\VS2015\Release>Test.exe
CBase():Constructor:0
CDerive():Constructor:0
CBase():Constructor:1
CDerive():Constructor:1
CBase():Constructor:2
CDerive():Constructor:2
p[0].id=0
p[1].id=1
p[2].id=2
&p[0]=004AFCB4
&p[1]=004AFCB8
&p[2]=004AFCBC
CDerive(): Destructor:2
CBase(): Destructor:2
CDerive(): Destructor:1
CBase(): Destructor:1
CDerive(): Destructor:0
CBase(): Destructor:0
总结:
由上述的结果可以看出,构造函数的调用是以从数组的低地址变量向高地址变量的顺序进行的。当退出局部栈时,析构函数的调用是以从高地址变量向低地址变量的顺序进行的。
C++学习笔记(7)----类的数组中构造函数和析构函数的调用顺序的更多相关文章
- C++C++中构造函数与析构函数的调用顺序
http://blog.csdn.net/xw13106209/article/details/6899370 1.参考文献 参考1: C++继承中构造函数.析构函数调用顺序及虚函数的动态绑定 参考2 ...
- C++中构造函数和析构函数的调用顺序
一般而言,析构函数调用的顺序和构造函数调用顺序相反,但是,对象的存储类别可以改变调用析构函数的顺序.举例说明: CreateAndDestroy类的定义 CreateAndDestroy类的成员函数的 ...
- C++:派生类的构造函数和析构函数的调用顺序
一.派生类 在C++编程中,我们在编写一个基类的派生类时,大致可以分为四步: • 吸收基类的成员:不论是数据成员还是函数成员,派生类吸收除基类的构造函数和析构函数之外的全部成员. • 改造基类函数:在 ...
- C++ Primer 学习笔记_54_类和数据抽象 --拷贝构造函数、赋值运算符
拷贝控制 --复制构造函数.赋值操作符 引言: 当定义一个新类型时,须要显式或隐式地指定复制.赋值和撤销该类型的对象时会发生什么– 复制构造函数.赋值操作符和析构函数的作用! 复制构造函数: ...
- c++学习笔记4,派生类的构造函数与析构函数的调用顺序(一)
測试源代码: //測试派生类的构造函数的调用顺序何时调用 //Fedora20 gcc version=4.8.2 #include <iostream> using namespace ...
- php面向对象学习笔记01-面向对象介绍、构造函数、析构函数
偶尔翻看以前的笔记.就整理下.方便以后的查阅 类-成员属性 成员属性是从某个事务提取出来的, 可以是基本数据类型,也可以是复合数据类型(数组,对象) //创建一个类 class Cat{ pubic ...
- leetcood学习笔记-26-删除排序数组中的重复项
题目描述: 第一次提交: class Solution: def removeDuplicates(self, nums) -> int: for i in range(len(nums)-1, ...
- C++中多态中构造函数与析构函数的调用
做个实验,看一下成员变量的构造析构,父类子类的构造析构,以及虚函数对调用的影响. #include <iostream> using namespace std; class Member ...
- Typescript 学习笔记四:回忆ES5 中的类
中文网:https://www.tslang.cn/ 官网:http://www.typescriptlang.org/ 目录: Typescript 学习笔记一:介绍.安装.编译 Typescrip ...
随机推荐
- Visual Studio进行负载测试,RIG和负载测试术语- Part II
对于一个多用户的应用程序,性能是非常重要的.性能不仅是执行的速度,它包括负载和并发方面.Visual Studio是可以用于性能测试的工具之一.Visual Studio Test版或Visual S ...
- Machine learning 第7周编程作业 SVM
1.Gaussian Kernel function sim = gaussianKernel(x1, x2, sigma) %RBFKERNEL returns a radial basis fun ...
- 利用flask-sqlacodegen快速导入ORM表结构
利用flask-sqlacodegen快速导入ORM表结构 友情提示:如果是使用pymysql请预先pip install 哦~ 这是window下使用virtualenv环境下执行的 Linux用户 ...
- java transient 和Volatile关键字
Volatile修饰的成员变量在每次被线程访问时,都强迫从主内存中重读该成员变量的值.而且,当成员变量发生变化时,强迫线程将变化值回写到主内存.这样在任何时刻,两个不同的线程总是看到某个成员变量的同一 ...
- JS框架设计之对象扩展一种子模块
对象扩展 说完了,对象的创建(框架的命名空间的创建)以及如何解决多库之间的命名空间冲突问题之后,接下来,就是要扩展我们的对象,来对框架进行扩展,我们需要一种新功能,将新添加的功能整合到我们定义的对象中 ...
- oauth2.0的授权流程详解
授权模式 1)oauth2.0 提供了四种授权模式,开发者可以根据自己的业务情况自由选择. 授权码授权模式(Authorization Code Grant) 隐式授权模式(简化模式)(Implici ...
- MongoDB的使用技巧(转)
最近常用到mongo. 看朋友这篇命令挺全的就转来了. 如果想查看当前连接在哪个数据库 下面,可以直接输入db > db Admin 想切换到test数据库下面 > use test sw ...
- python pip 安装OpenCV
cmd pip install opencv-contrib-python -i https://pypi.mirrors.ustc.edu.cn/simple/
- a+b+c的N次方展开
今天在给儿子看笔记本上的照片的时候,偶然发现了2009年手绘的一张a+b+c的N次方展开图,故写下面的博客以记之,为年轻时代的我点个赞! 20年前的我,一个充满激情的且富有专注力的数学发烧友! 10年 ...
- 13 Timer和TimerTask
下面内容转载自:http://blog.csdn.net/xieyuooo/article/details/8607220 其实就Timer来讲就是一个调度器,而TimerTask呢只是一个实现了ru ...