c++派生类的构造函数
- 格式:docx
- 大小:11.94 KB
- 文档页数:3
c++派生类的构造函数
C++是一门面向对象的编程语言,它允许程序员使用类和对象来封装数据和行为。在C++中,派生类是基于已存在的类(称为基类)创建的一种新类。派生类从基类继承了数据和方法,并且还可以添加新的属性和方法。
在C++中,派生类的构造函数是指创建派生类对象时所调用的函数。派生类的构造函数负责初始化派生类对象中从基类继承的成员和派生类自己添加的成员。本文将详细介绍C++派生类的构造函数。
在C++中,派生类的构造函数必须调用基类的构造函数,以初始化从基类继承的成员变量。在创建派生类对象时,首先创建基类对象,然后再对派生类对象进行初始化。
1. 构造函数必须有与类名相同的名称。
2. 构造函数可以有参数,也可以没有参数。
3. 派生类必须调用基类的构造函数,以初始化从基类继承的成员变量。
下面是一个基类Person和一个派生类Student的定义:
```cpp
class Person{
protected:
string name;
int age;
public:
Person(){}
void setName(string n){name = n;}
void setAge(int a){age = a;}
};
在定义派生类Student的时候,通过public继承了基类Person。此时,派生类的构造函数必须调用基类的构造函数,以初始化从基类继承的成员变量name和age。派生类新增加了一个成员变量grade,需要在自己的构造函数中进行初始化。 派生类构造函数可以有多种调用方式,具体如下:
1. 用基类构造函数初始化列表初始化派生类对象
初始化列表是C++语言提供的一种简洁的初始化成员变量的语法。它使用冒号(:)后接一个以逗号分隔的初始化列表,在其中对派生类和基类成员变量进行初始化。
下面是Student类中使用初始化列表对基类成员变量进行初始化的方法:
在上面的代码中,派生类Student的构造函数使用冒号后接一个初始化列表来初始化基类成员变量name和age。这里的Person(n, a)表示调用基类Person的构造函数,并传入name和age作为参数。
2. 在派生类构造函数体中调用基类构造函数
这种方式是将上面两种方式结合在一起的方式,既在构造函数体中显式地调用基类构造函数,又使用初始化列表初始化派生类对象。
在派生类的构造函数中,先执行基类的构造函数,然后执行派生类的构造函数。在执行基类构造函数时,会根据调用的方式来确定要调用哪一个基类构造函数。如果派生类构造函数使用了初始化列表,则调用派生类中指定的基类构造函数;否则,调用基类的默认构造函数。
在创建Student对象s的时候,先创建基类Person对象,然后再对派生类Student对象进行初始化。具体的调用顺序如下:三、常见的派生类构造函数写法
1. 无参构造函数
如果基类没有显式地定义带参数的构造函数,则在派生类的构造函数中,可以不用显式调用基类的构造函数。下面就是一个不显式调用基类构造函数的派生类构造函数:
```cpp
class Circle : public Shape{
public:
Circle() : radius_{0} {
std::cout << "Circle()";
}
void set_radius(double radius) { radius_ = radius; }
private: double radius_;
};
```
在这个例子中,Circle类继承了Shape类。由于Shape类没有显式地定义带参数的构造函数,因此在Circle类的构造函数中就不需要显式调用Shape类的构造函数了。
2. 使用初始化列表调用基类构造函数
在派生类中使用初始化列表显式地调用基类构造函数,这种方法也十分常见。
3. 实现派生类构造函数
1. 在派生类的构造函数中,必须显式地调用基类的构造函数。
3. 派生类的成员初始化的顺序是由派生类成员声明的顺序决定的,而与初始化列表中列出的顺序无关。
4. 派生类对象的大小等于基类对象的大小加上在派生类中新增加的成员变量的大小。
5. 由于派生类对象与基类对象具有不同的类型,不能将派生类对象直接赋值给基类对象(虽然可以将基类指针或引用指向派生类对象)。
6. 如果派生类定义了析构函数,则在析构派生类对象时,会自动先调用派生类的析构函数,然后再调用基类的析构函数。
总结:
派生类的构造函数是一种非常重要的构造函数,它用于初始化派生类对象的成员变量和调用基类的构造函数。在写派生类的构造函数时,需要注意显式地调用基类的构造函数,并且可以使用初始化列表来调用基类的构造函数或对派生类新增的成员变量进行初始化。在实践中,我们应该在编码时深入了解派生类的构造函数,以便我们能够编写出更好的代码。