`
东边日出西边雨
  • 浏览: 258111 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

c++ 构造函数和析构函数调用顺序

    博客分类:
  • c
阅读更多

 

#include <iostream>
#include <vector>
using namespace std;

class Organisms
{
public:
	Organisms()
	{
		cout<<"Organisms constructor"<<endl;
	}
	~Organisms()
	{
		cout<<"Organisms distructor"<<endl;
	}

};

class Animal: public Organisms
{
public:
	Animal()
	{
		cout<<"Animal constructor"<<endl;
	}
	~Animal()
	{
		cout<<"Animal distructor"<<endl;
	}
};

class Person: public Animal
{
public:
	Person() {
		cout<<"Person constructor"<<endl;
	}
	~Person() {
		cout<<"Person distructor"<<endl;
	}
};


int main()
{ 
	Animal* p = new Person;
	delete p;
	getchar();
	return 0;
}

 

结果是:

Organisms constructor

Animal constructor

Person constructor

Animal distructor

Organisms distructor

 

       可以看出 创建实例时,构造函数调用顺序是: 基类的无参数构造函数--->子类无参数构造函数 (基->子)

而销毁对象时,析构函数调用顺序是: 子类无参数析构函数--->基类的无参数析构函数 (子->基)

 

       但是如果销毁对象时是用基类类型指针,那么就不会调用子类的析构函数了,就像上面看到的结果,这就很有可能出问题。

 

        从这里也可以看出,如果系统某个类可以被继承,请保证有无参数的构造函数。这两种情况都可以:

1. 不定义任何构造函数 (默认构函数就是无参数的)。

2. 自定义无参数构造函数。

 

事实上在c++中应该为任何类都应该提供无参数构造函数,这可是一个好习惯。

 

 

分享到:
评论

相关推荐

    C++构造函数和析构函数的调用顺序1

    C++构造函数和析构函数的调用顺序举例一.调用方法和区别1、构造函数的调用顺序: 基类构造函数、对象成员构造函数、派生类本身的构造函数 2、析构函数的调用顺序:

    C++构造函数和析构函数顺序

     先看看构造函数的调用顺序规则,只要我们在平时编程的时候遵守这种约定,任何关于构造函数的调用问题都能解决;构造函数的调用顺序总是如下:  1.基类构造函数。如果有多个基类,则构造函数的调用顺序是某类在...

    C++中构造函数与析构函数的调用顺序详解

    C++ 语言一直被批评太复杂了,很多细节的地方需要仔细推敲,甚至其构造函数和析构的调用顺序也成为了一个让人迷惑的问题,在此我做了简单的总结。这篇文章主要介绍了C++中构造函数与析构函数的调用顺序,需要的朋友...

    深入解析C++中的构造函数和析构函数

    调用构造函数和析构函数的顺序:先构造的后析构,后构造的先折构。它相当于一个栈,先进后出。 代码如下:#include&lt;iostream&gt;#include&lt;string&gt;using namespace std;class Student{ public: Student(string,string,...

    构造函数和析构函数程序(c++)

    构造函数的调用可以追踪。。。。由于构造函数和析构函数都是自动吊桶的或者更不饿,我们可以自己设立函数来追踪构造函数的调用过称。

    C++中的构造函数、析构函数剖析

    C++中的构造函数、析构函数剖析 在C+ + 中, 构造函数是一个在构件对象的时 候调用的特殊的函数, 其目的是对对象进行初始 化工作, 从而使对象被使用之前可以处于一种合 ...“构造函数”和“析构函数”的调用顺序

    C++构造函数和析构函数的使用与讲解

    构造函数(constructor) 1.构造函数是种特殊的类成员函数,遵循如下规则: a.函数名与类名必须相同。...3.构造函数和普通成员函数不一样,一般不显示调用。在创建一个对象时,构造函数自动调用(编译器来完成

    C++ 课程作业 类与对象2——构造函数、拷贝构造函数、析构函数(计算两个日期间的天数)

    3、请设计一个拷贝构造函数,实现将参数的值全部传递给当前对象,同时输出“拷贝构造函数被调用” 4、请设计一个析构函数,同时输出“析构函数被调用” 5、设计一个成员函数 int dayDiff(CTime t) ,用于计算...

    C++构造函数详解及显式调用构造函数.doc

    C++构造函数详解及显式调用构造函数.doc

    构造与析构顺序

    构造与析构在C++中,有一种特殊的成员函数,它的名字和类名相同,没有返回值,不需要用户显式调用(用户也不能调用),而是在创建对象时自动执行。这种特殊的成员函数就是构造函数(Constructor)。 初始化对象的...

    C++实验三.docx

    在Time类中增加拷贝构造函数的定义,主函数中调用该函数,运用调试工具跟踪,分析整个程序调用构造函数(包括拷贝构造函数)和析构函数的次数;再将f函数的形式参数分别修改为引用参数和指针参数(此时函数代码修改...

    C++ 虚继承对基类构造函数调用顺序的影响

    而继承包含了虚拟继承和普通继承,在可见性上分为public、protected、private。可见性继承比较简单,而虚拟继承对学习c++的难度较大。  首先,虚拟继承与普通继承的区别有:  假设derived 继承自base类,那么...

    C++构造函数重载

    重载构造函数,调用成员函数,供C++初学者理解构造函数重载的概念

    c++构造函数小测验

    这是课上用的quiz,c++语法,关于什么情况下会调用什么构造函数

    C++类成员构造函数和析构函数顺序示例详细讲解

    即构造类时,会先构造其父类,然后创建类成员,最后调用本身的构造函数。 下面看一个例子吧 代码如下:class c{public: c(){ printf(“c\n”); }protected:private:}; class b {public: b(){ printf(“b\n”);}...

    C++构造和析构的多态

    C++的多态是通过虚表指针来实现的。但是在构造和析构函数中调用虚函数,情况如何呢?是否还能实现多态呢?本文档从内存角度揭示了这其中的多态实现过程。

    构造函数不能声明为虚函数的原因及分析

    问题出来了,如果构造函数是虚的,就需要通过 vtable来调用,可是对象还没有实例化,也就是内存空间还没有,怎么找vtable呢?所以构造函数不能是虚函数。 2. 从使用角度,虚函数主要用于在信息不全的情况下,能使...

    C++实验2 类与对象

    观察构造函数和析构函数的调用顺序。 (2)定义一个简单的Computer类,有数据成员芯片(CPU),内存(ram),光驱(cdrom)等等,有两个公有成员函数run、stopo,CPU为CPU类的一个对象,ram为RAM类的一个对象,cdrom为...

    详解在C++中显式默认设置的函数和已删除的函数的方法

    在 C++ 中,如果某个类型未声明它本身,则编译器将自动为该类型生成默认构造函数、复制构造函数、复制赋值运算符和析构函数。这些函数称为特殊成员函数,它们使 C++ 中的简单用户定义类型的行为如同 C 中的结构。也...

Global site tag (gtag.js) - Google Analytics