`
deepfuture
  • 浏览: 4329139 次
  • 性别: Icon_minigender_1
  • 来自: 湛江
博客专栏
073ec2a9-85b7-3ebf-a3bb-c6361e6c6f64
SQLite源码剖析
浏览量:79390
1591c4b8-62f1-3d3e-9551-25c77465da96
WIN32汇编语言学习应用...
浏览量:68278
F5390db6-59dd-338f-ba18-4e93943ff06a
神奇的perl
浏览量:101369
Dac44363-8a80-3836-99aa-f7b7780fa6e2
lucene等搜索引擎解析...
浏览量:280936
Ec49a563-4109-3c69-9c83-8f6d068ba113
深入lucene3.5源码...
浏览量:14580
9b99bfc2-19c2-3346-9100-7f8879c731ce
VB.NET并行与分布式编...
浏览量:65443
B1db2af3-06b3-35bb-ac08-59ff2d1324b4
silverlight 5...
浏览量:31264
4a56b548-ab3d-35af-a984-e0781d142c23
算法下午茶系列
浏览量:45143
社区版块
存档分类
最新评论

C++构造函数调用顺序

阅读更多

class Y {...}
class X : public Y {...}
X one;

构造函数的调用顺序是下面的顺序:

Y(); // 基类的构造函数
X(); // 继承类的构造函数

对于多基类的情况,下面是一个例子:

class X : public Y, public Z
X one;

构造函数以声明的次序调用。

Y(); // 基类构造函数首先被调用
Z();
X();

虚基类的构造函数在任何非虚基类构造函数前调用。如果构造中包括多个虚基类,它们的调用顺序以声明顺序为准。如果虚类是由非虚类派生而来,那非虚类的构造函数要先被调用。下面是一个例子:

class X : public Y, virtual public Z
X one;

调用顺序如下:

Z(); // 虚基类初始化
Y(); // 非虚基类
X(); // 继承类

下面是一个复杂的例子:

class base;
class base2;
class level1 : public base2, virtual public base;
class level2 : public base2, virtual public base;
class toplevel : public level1, virtual public level2;
toplevel view;

构造函数调用顺序如下:

base(); // 虚基类仅被构造一次
base2();
level2(); // 虚基类
base2();
level1();
toplevel();

如果类继承中包括多个虚基类的实例,基类只被初始化一次。

1、如果类里面有成员类,成员类的构造函数优先被调用;

2、创建派生类的对象,基类的构造函数函数优先被调用(也优先于派生类里的成员类);

3、 基类构造函数如果有多个基类则构造函数的调用顺序是某类在类派生表中出现的
顺序而不是它们在成员初始化表中的顺序;


4、成员类对象构造函数如果有多个成员类对象则构造函数的调用顺序是对象在类中
被声明的顺序而不是它们出现在成员初始化表中的顺序;


5、派生类构造函数
作为一般规则派生类构造函数应该不能直接向一个基类数据成员赋值而是把值传递
给适当的基类构造函数否则两个类的实现变成紧耦合的(tightly coupled)将更加难于
正确地修改或扩展基类的实现。(基类设计者的责任是提供一组适当的基类构造函数)

分享到:
评论

相关推荐

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

    可见性继承比较简单,而虚拟继承对学习c++的难度较大。  首先,虚拟继承与普通继承的区别有:  假设derived 继承自base类,那么derived与base是一种“is a”的关系,即derived类是base类,而反之错误;  ...

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

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

    C++构造函数的调用顺序

    构造函数的执行次序如下: ...1,调用基类构造函数,调用顺序按照他们的继承时声明的顺序。 2,调用内嵌成员对象的构造函数,调用顺序按照他们在类中声明的 顺序。 3,派生类的构造函数体中的内容。

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

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

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

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

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

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

    C++构造函数初始化顺序

    C++构造函数按下列顺序被调用:  (1)任何虚拟基类的构造函数按照它们被继承的顺序构造;  (2)任何非虚拟基类的构造函数按照它们被继承的顺序构造;  (3)任何成员对象的构造函数按照它们声明的顺序调用;  (4...

    C++聚合关系类的构造函数的调用顺序详解

    下面小编就为大家带来一篇C++聚合关系类的构造函数的调用顺序详解。小编觉得挺不错的,现在就分享给大家,也给大家做个参考,一起跟随小编过来看看吧

    C++构造函数初始化顺序详解

    2.缺省构造函数时,系统将自动调用该缺省构造函数初始化对象,缺省构造函数会将所有数据成员都初始化为零或空 3.创建一个对象时,系统自动调用构造函数 析构函数 1.析构函数没有参数,也没有返回值。不能重载,也...

    构造与析构顺序

    构造与析构在C++中,有一种特殊的成员...构造函数与类同名且无返回值,在对象实例化时自动调用 构造函数可以有多个重载形式 实例化对象时仅用到一个构造函数 当用户没有定义构造函数时,编译器自动生产一个构造函数。

    构造函数调用次序证明

    构造函数顺序证明,我上C++课上用到的~~

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

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

    完全掌握C++编程中构造函数使用的超级学习教程

    按声明顺序调用基类和成员构造函数。 如果类派生自虚拟基类,则会将对象的虚拟基指针初始化。 如果类具有或继承了虚函数,则会将对象的虚函数指针初始化。虚函数指针指向类中的虚函数表,确保虚函数正确地调用绑定...

    c++基础语法:构造函数初始化列表

    1.必须这样做:如果我们有一个类成员,它本身是一个类或者是一个结构,而且这个成员它只有一个带参数的构造函数,而没有默认构造函数,这时要对这个类成员进行初始化,就必须调用这个类成员的带参数的构造函数,如果...

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

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

    C++经典语法与应用

    C++经典语法与应用,类的编写与应用,构造与析构函数,函数的重载,类的继承,函数覆盖,基类与派生类的构造函数、析构函数先后调用顺序,如何在派生类构造函数中向基类的构造函数传递参数,this成员变量,类型转换...

    C++ 类的深拷贝

    (1)实现构造函数重载,可以根据指定的元素个数动态创建初始值为0的整型数组,或根据指定的内置整型数组动态创建整型数组。 (2)设计拷贝构造函数和析构函数,注意使用深拷贝。 (3)设计存取指定位置的数组元素...

    C++经典语法掌握C++

    C++经典语法与应用,类的编写与应用,构造与析构函数,函数的重载,类的继承,函数覆盖,基类与派生类的构造函数、析构函数先后调用顺序,如何在派生类构造函数中向基类的构造函数传递参数,this成员变量,类型转换...

Global site tag (gtag.js) - Google Analytics