第五章构造函数调用顺序

合集下载

构造函数的执行顺序

构造函数的执行顺序

构造函数的执⾏顺序⼀、C#中构造函数有⼏种。

1.静态构造函数2.默认构造函数3.带参数的构造函数⼆、顺序如何执⾏呢?先看代码:class MyClass{static MyClass(){Console.WriteLine("静态构造函数被调⽤。

");}private static Component staticField = new Component("静态字段被实例化。

");private Component instanceField = new Component("实例成员字段被实例化。

");public MyClass(){Console.WriteLine("对象构造函数被调⽤。

");}}//此类型⽤于作MyClass类的成员//此类型在实例化的时候可以再控制台输出⾃定义信息,以给出相关提⽰class Component{public Component(String info){Console.WriteLine(info);}}class Program{static void Main(string[] args){MyClass instance = new MyClass();Console.Read();}} 运⾏结果:1.静态字段被实例化2.静态构造函数被调⽤3.实例成员字段被实例化4.对象构造函数被调⽤再来看看带基类的构造函数是如何运⾏class Base{static Base(){Console.WriteLine("基类静态构造函数被调⽤。

");}private static Component baseStaticField = new Component("基类静态字段被实例化。

");private Component baseInstanceField = new Component("基类实例成员字段被实例化。

c++ 类的构造析构函数顺序总结

c++ 类的构造析构函数顺序总结

c++ 类的构造析构函数顺序总结(一)构造函数顺序1、默认构造函数:当一个类的对象没有传递任何实参时,编译器会调用一个默认的无参构造函数,这个构造函数不需要使用户自定义,编译器会自动提供。

2、显式构造:当用户指定了构造函数时,编译器会按用户指定的构造函数来构造对象,这种构造方式叫做显式构造。

3、静态成员的构造:当一个类中包含有静态成员时,该类中的构造函数会优先构造该类中的静态成员,在构造该类中其它的成员之前会先构造该类中的静态成员,这种构造方式叫做静态成员的构造。

4、基类的构造:当一个类继承自一个父类时,该类中的构造函数会首先构造该类的父类,在构造该类中的其它成员之前会首先构造该类的父类,这种构造方式叫做基类的构造。

5、成员变量构造:当一个类中包含有许多成员变量时,该类的构造函数会挨个构造该类中的各个成员变量,这种构造方式叫做成员变量构造。

6、用户自定义构造:当一个类有了一个用户自定义的构造函数时,该类中的构造函数会按用户自定义的构造函数来构造该类的对象,这种构造方式叫做用户自定义构造函数。

(二)析构函数顺序1、用户自定义的析构函数:当一个类有了一个用户自定义的析构函数时,该类中的析构函数会按用户自定义的析构函数来析构该类的对象,这种析构方式叫做用户自定义析构函数。

2、成员变量析构:当一个类中包含有许多成员变量时,该类的析构函数会按倒序析构该类中的各个成员变量,这种析构方式叫做成员变量析构。

3、基类的析构:当一个类继承自一个父类时,该类中的析构函数会最后析构该类的父类,在析构该类中其它的成员之后会最后析构该类的父类,这种析构方式叫做基类的析构。

4、静态成员的析构:当一个类中包含有静态成员时,该类中的析构函数会最后析构该类中的静态成员,在析构该类中其它的成员之后会最后析构该类中的静态成员,这种析构方式叫做静态成员的析构。

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

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

C++构造函数和析构函数的调⽤顺序、虚析构函数的作⽤构造函数和析构函数的调⽤顺序构造函数的调⽤顺序:当建⽴⼀个对象时,⾸先调⽤基类的构造函数,然后调⽤下⼀个派⽣类的构造函数,依次类推,直⾄到达最底层的⽬标派⽣类的构造函数为⽌。

析构函数的调⽤书序:当删除⼀个对象时,⾸先调⽤该派⽣类的析构函数,然后调⽤上⼀层基类的析构函数,依次类推,直到到达最顶层的基类的析构函数为⽌。

简单的说,构造函数是“⾃上向下”调⽤,析构函数是“⾃下⽽上”调⽤。

演⽰代码如下:#include<iostream>using namespace std;class Base{public:Base(){cout<<"创建Base基类。

"<<endl;}~Base() {cout<<"删除Base基类。

"<<endl;}};class Child : public Base{public:Child() {cout<<"创建Child派⽣类。

"<<endl;}~Child() {cout<<"删除Child派⽣类。

"<<endl;}};int main(){cout<<"*********构造函数调⽤顺序⽰例***********"<<endl;Child *C1 = new Child;cout<<"*********析构函数调⽤顺序⽰例***********"<<endl;delete C1;}运⾏结果如下图:虚析构函数的作⽤通过基类的指针来删除派⽣类的对象时,基类的析构函数应该是虚的。

原因:在公有继承中,基类对派⽣类及其对象的操作,只能影响到那些从基类继承下来的成员。

第5章 派生类与继承

第5章 派生类与继承

void print();
};
print();
};
//定义一个基类 class person{ protected: char name[10]; int age; char sex; public: //…… }; //定义一个派生类 class employee:public person { protected: char department[20]; float salary; public: //…… };
当类的继承方式为私有继承时,基类的public成员和 protected成员被继承后作为派生类的private成员,派生类 的其他成员可以直接访问它们,但是在类外部通过派生类的 对象无法访问。
基类的private成员在私有派生类中是不可直接访问的, 所以无论是派生类成员还是通过派生类的对象,都无法直接 访问从基类继承来的private成员,但是可以通过基类提供 的public成员函数间接访问。 例5.1一个私有继承的例子
由于派生类继承了基类的成员,派生类的构造 函数需要调用基类的构造函数对其中定义于基 类的数据成员进行初始化。 给基类构造函数传递实际参数是通过向派生类 构造函数传递实际参数以及初始化列表来间接 实现传递的。
5.2.1 派生类构造函数和析构函数的执行顺 序 通常情况下,当创建派生类对象时, 首先执行基类的构造函数,随后再执行 派生类的构造函数; 当撤消派生类对象时,则先执行派生 类的析构函数,随后再执行基类的析构 函数。
例5.3 公有继承的访问规则
表5-3 公有继承的访问规则
基类成员 内部访问 对象访问 Private成员 不可访问 不可访问 public成员 可访问 可访问 protected成员 可访问 不可访问

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

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

C++构造函数和析构函数的调⽤顺序1、构造函数的调⽤顺序基类构造函数、对象成员构造函数、派⽣类本⾝的构造函数2、析构函数的调⽤顺序派⽣类本⾝的析构函数、对象成员析构函数、基类析构函数(与构造顺序正好相反)3、特例局部对象,在退出程序块时析构静态对象,在定义所在⽂件结束时析构全局对象,在程序结束时析构继承对象,先析构派⽣类,再析构⽗类对象成员,先析构类对象,再析构对象成员4、例⼦#include <iostream>using namespace std;class Base1{public:Base1(void){cnt++;cout<<"Base1::constructor("<<cnt<<")"<<endl;}~Base1(void){cnt--;cout<<"Base1::deconstructor("<<cnt + 1<<")"<<endl;}private:static int cnt;};int Base1::cnt = 0;class Base2{public:Base2(int m){num = m; cout<<"Base2::constructor("<<num<<")"<<endl;}~Base2(void){cout<<"Base2::deconstructor("<<num<<")"<<endl;}private:int num;};class Example{public:Example(int n){num = n; cout<<"Example::constructor("<<num<<")"<<endl;}~Example(void){cout<<"Example::deconstructor("<<num<<")"<<endl;}private:int num;};class Derived:public Base1, public Base2{public:Derived(int m, int n):Base2(m),ex(n){cnt++;cout<<"Derived::constructor("<<cnt<<")"<<endl;}~Derived(void){cnt--;cout<<"Derived::deconstructor("<<cnt+1<<")"<<endl;}private:Example ex;static Example stex; //Example::constructor(1) //不能输出static int cnt;};int Derived::cnt = 0;Derived ge_a(1,2); // Base1::constructor(1)// Base2::constructor(1)// Example::constructor(2)// Derived::constructor(1)static Derived gs_b(3,4); // Base1::constructor(2)// Base2::constructor(3)// Example::constructor(4)// Derived::constructor(2)int main(void){cout << "---------start---------" << endl;Derived d(5,6); // Base1::constructor(3) // Base2::constructor(5)// Example::constructor(6)// Derived::constructor(3)Derived e(7,8); // Base1::constructor(4) // Base2::constructor(7)// Example::constructor(8)// Derived::constructor(4)cout << "----------end----------" << endl;//Derived e(7,8) 析构// Derived::deconstructor(4)// Example::deconstructor(8)// Base2::deconstructor(7)// Base1::deconstructor(4)//Derived d(5,6) 析构// Derived::deconstructor(3)// Example::deconstructor(6)// Base2::deconstructor(5)// Base1::deconstructor(3)return 0;}//static Derived gs_b(3,4) 析构// Derived::deconstructor(2)// Example::deconstructor(4)// Base2::deconstructor(3)// Base1::deconstructor(2)//Derived ge_a(1,2) 析构// Derived::deconstructor(1)// Example::deconstructor(2)// Base2::deconstructor(1)// Base1::deconstructor(1)//static Example stex 析构//Example::deconstructor(1) //不能输出#include <iostream>using namespace std;class A{public:A(){cout<<"A::constructor"<<endl;};~A(){cout<<"A::deconstructor"<<endl;}; };class B{public:B(){cout<<"B::constructor"<<endl;};~B(){cout<<"B::deconstructor"<<endl;}; };class C : public A{public:C(){cout<<"C::constructor"<<endl;};~C(){cout<<"C::deconstructor"<<endl;}; private:// static B b;B b;};class D : public C{public:D(){cout<<"D::constructor"<<endl;};~D(){cout<<"D::deconstructor"<<endl;}; };int main(void){C* pd = new D();delete pd;return 0;}/* Output----->B bA::constructorB::constructorC::constructorD::constructorC::deconstructorB::deconstructorA::deconstructor ----->static B b A::constructor C::constructor D::constructor C::deconstructor A::deconstructor */。

寻找整形数组中的最小值及构造函数析构函数的调用顺序

寻找整形数组中的最小值及构造函数析构函数的调用顺序

寻找整形数组中的最小值及构造函数析构函数的调用顺序在计算机编程中,整形数组是常用的一种数据类型。

由于整形数组中存储的是整数类型的变量,因此在使用时需要对其进行一些操作,例如查找其中的最小值。

本文将对如何寻找整形数组中的最小值及构造函数析构函数的调用顺序进行介绍,希望对读者有所帮助。

一、寻找整形数组中的最小值在整形数组中寻找最小值,需要遍历整个数组,将每个元素与当前最小值进行比较,逐步更新最小值,最终得到数组中的最小值。

具体的实现方式如下:```int findMin(int array[], int length) {int min = array[0]; // 初始化最小值为数组第一个元素for (int i = 1; i < length; i++) {if (array[i] < min) {min = array[i]; // 将当前元素更新为最小值}}return min;}```代码中,首先将最小值初始化为数组的第一个元素,然后遍历整个数组,将每个元素与最小值进行比较,如果当前元素小于最小值,则将最小值更新为当前元素,最终返回最小值。

二、构造函数与析构函数的调用顺序在使用整形数组时,往往需要借助构造函数和析构函数进行一些初始化和清理工作。

例如,在使用动态内存分配时,需要在构造函数中进行分配操作,在析构函数中进行释放操作。

构造函数和析构函数的调用顺序如下:1. 构造函数的调用顺序在使用整形数组时,构造函数的调用顺序是从外向内,即先调用成员数组的构造函数,再调用类的构造函数。

例如:```class MyArray {public:MyArray(int size) {m_size = size;m_data = new int[m_size];cout << "MyArray constructed." << endl; }~MyArray() {delete[] m_data;cout << "MyArray destructed." << endl; }private:int m_size;int* m_data;};class MyClass {public:MyClass(int size) : m_array(size) {cout << "MyClass constructed." << endl; }~MyClass() {cout << "MyClass destructed." << endl;}private:MyArray m_array;};int main() {MyClass obj(10);return 0;}// 输出结果:// MyArray constructed.// MyClass constructed.// MyClass destructed.// MyArray destructed.```代码中,先定义了一个MyArray类,其中包含成员变量m_size和m_data,分别表示数组大小和指向数组的指针。

如何调用构造函数

如何调用构造函数
构造函数是一种特殊的函数,用于创建对象时初始化对象的值。

调用构造函数的方法与调用普通函数有所不同。

以下是如何调用构造函数的步骤:
1. 创建对象:使用 new 关键字创建一个对象。

例如:var obj = new MyClass();
2. 分配内存:新对象被创建后,系统会为对象分配内存。

3. 调用构造函数:然后调用构造函数初始化对象的属性和方法。

构造函数的名称与类名相同,可以带参数。

例如:
```
function MyClass(name, age){
= name;
this.age = age;
}
```
4. 返回对象:构造函数执行完毕后,返回对象的引用。

此时,对象已经被初始化并在内存中分配了空间。

5. 操作对象:可以使用对象引用来访问和操作对象的属性和方法。

例如:
```
var obj = new MyClass('John', 30);
console.log(); // 输出:John
console.log(obj.age); // 输出:30
```
总之,调用构造函数的过程是创建对象、分配内存、调用构造函数、返回对象引用以及操作对象等步骤的组合。

c调用父类的构造函数

c调用父类的构造函数摘要:1.C 语言中的构造函数2.父类和子类的关系3.调用父类的构造函数4.构造函数的调用顺序5.构造函数的重载正文:C 语言中的构造函数是一种特殊的成员函数,它在类的对象创建时自动执行,用于初始化类的成员变量。

构造函数的参数是该类的对象,因此在使用构造函数时,我们不需要指定参数。

在C++中,我们可以定义一个基类(父类)和多个派生类(子类)。

当创建一个派生类的对象时,会自动调用基类的构造函数,然后再调用派生类的构造函数。

这种继承关系使得我们可以在派生类中重用基类的代码,实现代码的复用。

当我们在派生类中调用基类的构造函数时,需要使用关键字“:”。

例如,如果我们有一个基类和一个派生类,如下所示:```cppclass Base {public:Base() {// 基类的构造函数}};class Derived : public Base {public:Derived() {// 派生类的构造函数Base::Base(); // 调用基类的构造函数}};```在上面的代码中,我们定义了一个基类`Base`和一个派生类`Derived`。

当创建一个`Derived`类型的对象时,会首先调用`Base`类的构造函数,然后再调用`Derived`类的构造函数。

这样,我们可以在`Derived`类中使用`Base`类中的成员变量和成员函数,实现代码的复用。

在C++中,构造函数的调用顺序是按照继承关系的相反顺序进行的。

也就是说,先调用派生类的构造函数,然后再调用基类的构造函数。

这种调用顺序可以确保基类的成员变量和成员函数在派生类的构造函数中正确初始化。

此外,C++还支持构造函数的重载。

这意味着我们可以在一个类中定义多个构造函数,这些构造函数可以有不同的参数列表。

当创建类的对象时,编译器会根据传入的参数自动选择正确的构造函数。

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

析构函数和构造函数调用顺序构造函数和析构函数是面向对象编程中常用的两个概念,它们在对象的创建和销毁过程中起着重要的作用。

本文将分别介绍构造函数和析构函数的调用顺序。

一、构造函数的调用顺序构造函数是在对象创建时被调用的特殊成员函数,用于初始化对象的数据成员。

在创建对象时,编译器会自动调用构造函数。

1. 默认构造函数如果类没有定义任何构造函数,编译器会自动生成一个默认构造函数。

默认构造函数不接受任何参数,仅进行默认的初始化操作。

当创建对象时,会首先调用默认构造函数。

2. 带参数的构造函数如果类定义了带参数的构造函数,那么在创建对象时,可以通过传递参数来调用相应的构造函数。

如果定义了多个带参数的构造函数,编译器会根据实际传递的参数类型和个数来选择调用哪个构造函数。

3. 派生类构造函数调用顺序如果类是派生类,它的构造函数在创建对象时会先调用基类的构造函数,然后再调用自身的构造函数。

这是因为派生类的对象包含了基类的成员,所以需要先初始化基类的成员,再初始化自身的成员。

二、析构函数的调用顺序析构函数是在对象销毁时被调用的特殊成员函数,用于释放对象所占用的资源。

在对象销毁时,编译器会自动调用析构函数。

1. 默认析构函数如果类没有定义任何析构函数,编译器会自动生成一个默认析构函数。

默认析构函数不做任何操作。

当销毁对象时,会首先调用默认析构函数。

2. 派生类析构函数调用顺序如果类是派生类,它的析构函数在销毁对象时会先调用自身的析构函数,然后再调用基类的析构函数。

这是因为派生类的对象的成员在内存中的布局是先基类的成员,然后是自身的成员,所以需要先释放自身的成员,再释放基类的成员。

三、构造函数和析构函数的调用顺序总结1. 构造函数的调用顺序是先调用基类的构造函数,然后再调用派生类的构造函数。

2. 析构函数的调用顺序是先调用派生类的析构函数,然后再调用基类的析构函数。

3. 构造函数和析构函数的调用顺序与对象的创建和销毁顺序相反。

子类和父类的构造方法的调用顺序

建的过程中自动调用的一个特殊方法。它用于初始化对象的状态,为对象的成员变量赋初始值,以及执行其他一些必要的操作。在Java中,每个类都有一个默认的构造方法,如果没有显式地定义构造方法,那么编译器会自动生成一个默认的构造方法。同时,可以根据需要在类中定义多个构造方法,以提供不同的初始化方式。
System.out.println("父类的有参构造方法,参数为" + num);
}
public class Child extends Parent
public Chil
System.out.println("子类的无参构造方法");
}
public Child(int num)
super(num);
Child child2 = new Child(10); // 输出:父类的有参构造方法,参数为10 子类的有参构造方法,参数为10
}
```
在上面的示例代码中,创建Child对象时会首先调用Parent的构造方法,然后再调用Child的构造方法。对于无参构造方法,子类的构造方法会先调用父类的无参构造方法,然后再执行子类的构造方法体。对于有参构造方法,子类必须通过super关键字显式地调用父类的有参构造方法,然后再执行子类的构造方法体。这样可以确保所有的成员变量都得到了正确的初始化。
总结起来,子类和父类的构造方法的调用顺序是先调用父类的构造方法,然后再调用子类的构造方法。在子类的构造方法中,通过super关键字可以显式地调用父类的构造方法,但如果没有显式地调用,编译器会自动在子类的构造方法中插入一个默认的super(语句,以调用父类的无参构造方法。
当创建子类对象时,子类的构造方法会先调用父类的构造方法,然后再执行子类的构造方法。这是由于子类继承了父类的成员变量和方法,而构造方法的目的就是为了初始化这些成员变量,所以必须先初始化父类的成员,然后再初始化子类的成员。
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

(1)在公有继承时,派生类的成员函数可 以访问基类中的公有成员和保护成员。 (2)在私有继承时,基类的成员只能由直 接派生类访问,而无法再往下继承。 (3)对于基类中的私有成员,只能被基类 中的成员函数和友元函数所访问,不能被其他 的函数访问。
思考
class A{ public: int pub_value_A; private: int pri_value_A; protected: int pro_value_A; }; class B:public A{ }; class C:private A{ };
继承机制下的构造和析构函数
#include <iostream> int main() #include <string> { using namespace std; return 0; class A } { public: A(int a){cout<<"constructor of A"<<endl;} }; class Base { public: Base(int b){cout<<"constructor of Base"<<endl;} }; class Derive:public Base { public: A a; Derive(){cout<<"constructor of derive"<<endl;} };
//Derive(int value) :Base(value){cout<<"constructor of derive"<<endl;}
派生类构造函数的一般格式
派生类名(派生类构造函数总参数表) 基类构造函数(参数表1) 派生类名(派生类构造函数总参数表) :基类构造函数(参数表 ), 对象成员名(参数表2) 对象成员名(参数表 ) { 派生类中数据成员初始化 } 注意: 注意: (1)调用基类构造函数,应该用基类名; )调用基类构造函数,应该用基类名; (2)调用对象成员的构造函数,应该用对象成员的名字。 )调用对象成员的构造函数,应该用对象成员的名字。
//Derive(int value) :a(value){cout<<"constructor of derive"<<endl;}
基类构造函数的调用
class Base { public: Base(int b){cout<<"constructor of Base"<<endl;} }; 编译错误,基类成员不 class Derive:public Base 能够被初始化。 { public: Derive(){cout<<"constructor of derive"<<endl;} }; int main() { return 0; }
{
A public B void main() B *obj_b=new B; obj_b->pub_value_A=10; obj_b->pro_value_A=20; obj_b->pri_value_A=30; C *obj_c=new C; obj_c->pub_value_A=10; obj_c->pro_value_A=20; obj_c->pri_value_A=30; } private C
苹果皮 果皮箱 水果皮 苹果皮箱
类型适应
• 类型适应是指两种类型之间的关系。例如,B类型适应A类型是 指B类型的对象能够用于A类型的对象所能使用的场合。 派生类的对象可以用于基类对象所能使用的场合,我们说派生类 适应于基类。同样道理,派生类对象的指针和引用也适应于基类 对象的指针和引用。 子类型化与类型适应是致的。B类型是A类型的子类型,那么B类 型必将适应于A类型。 子类型的重要性就在于减轻程序人员编写程序代码的负担。因为 一个函数可以用于某类型的对象,则它也可以用于该类型的各个 子类型的对象,这样就不必为处理这些子类型的对象去重载该函 数。
类型适应的使用场合
1、函数参数传递; 2、指针赋值。 Apple *app; Fruit *fru; fru=app; // app=fru; //谁对?谁不对? 注意:类型适应是面向对象多态性的很好 体现,是面向对象的程序具有了很强的 灵活性。但只有用指针才能体现。
课后习题
1、请描述基类、派生类、对象成员的构造 和析构顺序。 2 2、
不同继承方式的基类和派生类特性
继承方式 基类特性 public 公有继承 protected private public 私有继承 protected private public 保护继承 protected private 派生类特性 public protected 不可访问 private private 不可访问 protected protected 不可访问
类型适应
1、什么是类型适应? 例: #include <iostream.h> int function(int para){return para;} void main() { float a=10.5; cout<<function(a); }//对?不对???
A
B
void func( A *para){} B * b_obj; func(b_obj); //对?不对??? void func2(B * para){} A *a_obj; func2(a_obj); //对?不对???
继承中构造、析构函数的调用顺序
如果派生类和基类都有构造函数,在定义一派生 类时,系统首先调用基类的构造函数,然后再调用派 生类的构造函数。在继承关系下有多个基类时,基类 构造函数的调用顺序取决于定义派生类时基类的定义 顺序。 由于析构函数也不能被继承,因此在执行派生类 的析构函数时,基类的析构函数也将被调用。执行顺 序是先执行派生类的析构函数,再执行基类的析构函 数,其顺序与执行构造函数时的顺序正好相反。
完整的写法
int main() #include <iostream> #include <string> { using namespace std; return 0; class A } { public: A(int a){cout<<"constructor of A"<<endl;} }; class Base { public: Base(int b){cout<<"constructor of Base"<<endl;} }; class Derive:public Base { public: A a; Derive():Base(10),a(10){cout<<"constructor of derive"<<endl;} }; Derive(int v_a,int v_b): Base(v_a),a(v_b){cout<<"constructor of derive"<<endl;}
对象成员初始化
#include <iostream> #include <string> using namespace std; class A { public: A(int a){cout<<"constructor of A"<<endl;} }; class Derive { public: A a; Derive() :a(10){cout<<"constructor of derive"<<endl;} };
C++语言的继承格式
单继承的定义格式如下: class 派生类名:继承方式 基类名 派生类名: { public: : members; //派生类新定义成员 ; 派生类新定义成员 private: : members; //派生类新定义成员 ; 派生类新定义成员 protected: : members; //派生类新定义成员 ; 派生类新定义成员 }; ; 其中,派生类名 是新定义的一个类的名字,它是从<基类名>中派生 的,并且按指定的 继承方式 派生的。 继承方式 常作用如下三 种关键字给予表示: public:公有继承; private:私有继承,可默认声明; protected:保护继承。
基类构造函数的调用
class Base { public: Base(int b){cout<<"constructor of Base"<<endl;} }; class Derive:public Base { public: Derive() :Base(10){cout<<"constructor of derive"<<endl;} }; int main() { return 0; }
继承机制下的构造和析构函数
构造函数的义务: (1)每个类必须负责自己的对象成 员初始化, (2)构造函数不能够被继承,派生 类的构造函数还必须调用基类的构造函 数来初始化基类成员;
对象成员初始化
#include <iostream> #include <string> using namespace std; class A { public: A(int a){cout<<"constructor of A"<<endl;} }; class Derive 编译错误,对象成员a { public: 不能够被初始化。 A a; Derive(){cout<<"constructor of derive"<<endl;} };
相关文档
最新文档