21xrx.com
2024-12-22 19:59:52 Sunday
登录
文章检索 我的文章 写文章
C++派生类的构造函数怎么写?
2023-07-10 05:14:56 深夜i     --     --
C++ 派生类 构造函数 继承 初始化列表

在C++中,派生类可以通过继承基类的构造函数来初始化基类成员,也可以自己定义构造函数。本文将就C++派生类的构造函数的写法进行详细介绍。

1.继承基类构造函数

当派生类没有定义构造函数时,编译器会自动调用基类的默认构造函数。如果想使用基类的构造函数来初始化成员,则需要在派生类的构造函数中显示地调用基类的构造函数。例如:


#include<iostream>

using namespace std;

class Base {

public:

  Base() cout << "Base default constructor called" << endl;

  Base(int i) cout << "Base constructor with int parameter called" << endl;

};

class Derived :public Base {

public:

  Derived() :Base() cout << "Derived default constructor called" << endl;

  Derived(int i) :Base(i) cout << "Derived constructor with int parameter called" << endl;

};

int main() {

  Derived d;

  Derived d2(5);

  return 0;

}

输出结果为:


Base default constructor called

Derived default constructor called

Base constructor with int parameter called

Derived constructor with int parameter called

在派生类定义的构造函数的初始值列表中,通过使用基类名加上参数列表的方式调用基类的构造函数即可。

2.自定义构造函数

如果派生类需要自己定义构造函数,则需要在构造函数中通过构造函数初始化列表来初始化基类成员。例如:


#include<iostream>

using namespace std;

class Base {

public:

  Base() cout << "Base default constructor called" << endl;

  Base(int i) cout << "Base constructor with int parameter called" << endl;

};

class Derived :public Base {

public:

  Derived() :m_value(0), Base() cout << "Derived default constructor called" << endl;

  Derived(int i, int j) :m_value(i), Base(j) cout << "Derived constructor with int parameters called" << endl;

private:

  int m_value;

};

int main() {

  Derived d;

  Derived d2(5, 6);

  return 0;

}

输出结果为:


Base default constructor called

Derived default constructor called

Base constructor with int parameter called

Derived constructor with int parameters called

在自定义构造函数时,需要注意以下几点:

(1)如果基类的构造函数需要参数,则需要在构造函数初始化列表中显式地传递参数。

(2)在创建对象时,首先调用基类的构造函数,然后调用派生类的构造函数,因此构造函数初始化列表中要优先初始化基类成员。

(3)可以在派生类中定义多个构造函数,只要与基类的构造函数有相同的参数列表即可。接着,派生类构造函数可以为本身引入其他的特征。

综上所述,C++派生类的构造函数需要通过继承基类的构造函数或自定义构造函数来初始化基类成员,需要注意构造函数初始化列表中顺序问题。掌握正确的写法,可以为程序编写提供更好的保障。

  
  

评论区

{{item['qq_nickname']}}
()
回复
回复