測试源代码:

//測试派生类的构造函数的调用顺序何时调用
//Fedora20 gcc version=4.8.2
#include <iostream>
using namespace std; class base
{
public:
base()
{ cout<<"base created!"<<endl;
}
~base()
{
cout<<"base destroyed!"<<endl;
}
};
//公有继承
class A:public base
{
public:
A()
{
cout<<"A created!"<<endl;
}
~A()
{
cout<<"A destroyed!"<<endl;
}
};
class B:public A
{
public:
B()
{
cout<<"B created!"<<endl;
}
~B()
{
cout<<"B destroyed!"<<endl;
}
};

測试代码:

int main()
{
A a;
<span style="color:#ff0000;">A *a1;</span>
cout<<"能够看到a1并没有调用基类的构造函数"<<endl;
<span style="color:#ff0000;">A *a2=new A;</span>
//仅仅有在new 一个对象的时候才会调用基类的构造函数
cout<<"能够看到a3也并没有调用基类的构造函数"<<endl;
A *a3=&a;
       B b;
}

输出为:

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcXE4NDQzNTIxNTU=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">

能够看到,在创建派生类的对象的时候,首先调用的是基类中的构造函数,然后才是调用派生类自己的构造函数。

而在析构的时候。顺序则刚好相反。先调用派生类的析构函数,然后才是调用基类的构造函数,这是由于对象创建时候对象存放在堆栈中的原因。

(new 的对象尽管是存在堆中,可是在堆栈中依旧存放其堆中的地址,因此,析构的时候也是一样)

那么,创建其对象的数组时:A a[2],是否会调用其构造函数呢,这是肯定的,例如以下

測试代码:(仅改动main里面的内容)

int main()
{
A a[2];
}

结果为:

那假设是创建指向其对象的数组呢? A *a[2];

int main()
{
A *a[2];
}

答案显然是不会。

那么这个时候,假设A里面有一个函数fun(),令a[0]->fun()会发生什么情况呢?

void fun()
{
cout<<"A fun run"<<endl;
}

測试代码:

int main()
{
A *a[2];
a[0]->fun();
}

结果为:

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcXE4NDQzNTIxNTU=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">

能够看到。尽管没有调用构造函数,可是依旧能够使其运行其成员函数呢!

那么,假设A有一个public int i;的变量。a[0]->i。会是什么?

class A:public base
{
public:
int i;
A()
{
cout<<"A created!"<<endl;
}
~A()
{
cout<<"A destroyed!"<<endl;
}
void fun()
{
cout<<"A fun run"<<endl;
}
};

測试代码:

int main()
{
A *a[2];
a[0]->fun();
cout<<endl<<a[0]->i<<endl;
}

结果:





能够看到,a[0]->i指向一个不确定的值!假设指定static const int i=1;那么,指向的必定就是1了。

今天就先測试这些最简单的吧。有点累了,多继承,虚基层明天再測试。

突然发现好像上次UC笔试做这道题的时候。析构的顺序似乎弄错了。郁闷。

还没收到面试信息,也还没有受到笔试挂了的通知。也不知道是个什么情况啊。

继续努力吧。

有时候。细节真的非常重要!

c++学习笔记4,派生类的构造函数与析构函数的调用顺序(一)的更多相关文章

  1. C++:派生类的构造函数和析构函数的调用顺序

    一.派生类 在C++编程中,我们在编写一个基类的派生类时,大致可以分为四步: • 吸收基类的成员:不论是数据成员还是函数成员,派生类吸收除基类的构造函数和析构函数之外的全部成员. • 改造基类函数:在 ...

  2. C++学习笔记(6)----基类和派生类的构造函数和析构函数的执行顺序

    基类和派生类:构造函数和析构函数的执行顺序 在Visual Studio中,新建控制台工程,构造类如下: #include<iostream> using namespace std; c ...

  3. C++:派生类的构造函数和析构函数

    4.2 派生类的构造函数和析构函数4.2.1 派生类构造函数和析构函数的执行顺序 通常情况下,当创建派生类对象时,首先执行基类的构造函数,随后再执行派生类的构造函数:当撤销派生类对象时,则先执行派生类 ...

  4. C++学习之路—继承与派生(二):派生类的构造函数与析构函数

    (根据<C++程序设计>(谭浩强)整理,整理者:华科小涛,@http://www.cnblogs.com/hust-ghtao转载请注明) 由于基类的构造函数和析构函数是不能被继承的,所以 ...

  5. C++学习笔记(7)----类的数组中构造函数和析构函数的调用顺序

    C++类的数组中构造函数和析构函数的调用顺序(2) 对于如下的代码: #include<iostream> using namespace std; class CBase { priva ...

  6. 不可或缺 Windows Native (21) - C++: 继承, 组合, 派生类的构造函数和析构函数, 基类与派生类的转换, 子对象的实例化, 基类成员的隐藏(派生类成员覆盖基类成员)

    [源码下载] 不可或缺 Windows Native (21) - C++: 继承, 组合, 派生类的构造函数和析构函数, 基类与派生类的转换, 子对象的实例化, 基类成员的隐藏(派生类成员覆盖基类成 ...

  7. cc28c_demo.cpp,派生类的构造函数和析构函数-代码示范3

    cc28c_demo.cpp,派生类的构造函数和析构函数-代码示范3 //派生类的构造函数和析构函数//派生类的构造函数(执行步骤)//--执行基类的构造函数//--执行成员对象的构造函数//--执行 ...

  8. C++C++中构造函数与析构函数的调用顺序

    http://blog.csdn.net/xw13106209/article/details/6899370 1.参考文献 参考1: C++继承中构造函数.析构函数调用顺序及虚函数的动态绑定 参考2 ...

  9. C++ 构造函数和析构函数的调用顺序、虚析构函数的作用

    构造函数和析构函数的调用顺序 构造函数的调用顺序: 当建立一个对象时,首先调用基类的构造函数,然后调用下一个派生类的构造函数,依次类推,直至到达最底层的目标派生类的构造函数为止. 析构函数的调用书序: ...

随机推荐

  1. 新建一个兼容eclipse和myeclipse、IDEA都兼容的项目结构(maven)

    以下观点为个人理解,没实践过,后续再实现. 思路: 1.eclipse和myeclipse.IDEA这些开发工具新建的各自的项目时,都有自己的一套思路,项目结构都有各自的特点. 2.如果是这些开发工具 ...

  2. C#如何把日期转成YYYYMMDDHHMMSSFFF的精确到毫秒的格式?

    C#如何把YYYY-MM-DD HH:MM:SS格式的日期转成YYYYMMDDHHMMSS的格式? 方法一:string   src= (new DataTime()).ToString(); str ...

  3. sqlserver 出现sql被锁时,查看加锁和被锁的sql

    原文:sqlserver 出现sql被锁时,查看加锁和被锁的sql DECLARE @spid INT DECLARE @blk INT DECLARE @count INT DECLARE @ind ...

  4. MySQL EXPLAIN 命令详解学习

    http://blog.csdn.net/mchdba/article/details/9190771

  5. EasyMvc入门教程

    EasyMvc 希望实现的目标:模块化,快速简单化,满足80%的常见需求.基于.Net Core 2.0.5开发.开发环境:VS2017,运行环境支持Window/Linux. 相关链接: 演示地址: ...

  6. 【机器学习】Mahout算法集

    在Mahout实现的机器学习算法见下表 算法类 算法名 中文名 分类算法 Logistic Regression 逻辑回归 Bayesian 贝叶斯 SVM 支持向量机 Perceptron 感知器算 ...

  7. 2017.7.10 (windows)redis的安装

    参考来自:http://www.runoob.com/redis/redis-install.html 1.下载地址 https://github.com/MSOpenTech/redis/relea ...

  8. 文本文件打印类库(C#)

    我写了一个打印文本文件的类库,功能包含:打印预览.打印.打印时能够选择打印机.能够指定页码范围. 调用方法很easy: TextFilePrinter p = new TextFilePrinter( ...

  9. 在项目中引用android.support.v7

    在Android开发中,新建的项目可能因为缺少对sopport工程的引用而报错,可以这样解决. 1.项目右键 --> import --> Android --> Existing ...

  10. C4:原型模式 Prototype

    用原型实例指定创建对象的种类,并且拷贝这些原型创建新的对象.应用场景: A.用new创建对象通常有较为复杂的数据准备或权限准备B.对象较大,拷贝对象可以节省内存 UML图: class WorkExp ...