8-4:C++继承之子类的默认构造函数如何使用
Posted 快乐江湖
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了8-4:C++继承之子类的默认构造函数如何使用相关的知识,希望对你有一定的参考价值。
子类的默认成员函数
…
…
…
前面我们说过,类共有6个默认成员函数,如果不写那么编译器就会我们自动生成
那么对于子类呢?子类继承了父类,它该如何处理默认成员函数
我们创建下面的父类Person
和子类Student
讲解
class Person
{
public:
Person(const char* name = "peter") :_name(name) {
cout << "构造" << endl;
}
Person(const Person& p) :_name(p._name){
cout << "拷贝构造" << endl;
}
Person& operator=(const Person& p) {
cout << "赋值" << endl;
if (this != &p) {
_name = p._name;
}
return *this;
}
~Person() {
cout << "析构" << endl;
}
protected:
string _name;
};
class Student : public Person
{
public:
protected:
int _num;
};
构造函数:子类的构造函数必须调用父类的构造函数初始化父类的那一部分成员,比如上面子类的name必须调用父类的构造函数去初始化(假如父类没有默认的构造函数),而像num这种可以自己初始化,写法有点像匿名对象
class Student : public Person
{
public:
Student(const char* name = "Bob", int num = 1):Person(name),_num(num)
{}
protected:
int _num;
};
int main()
{
Student s1("xiaowang",999);
}
拷贝构造:子类的拷贝构造函数必须调用父类的拷贝构造
class Student : public Person
{
public:
Student(const char* name = "Bob", int num = 1):Person(name),_num(num)
{}
Student(const Student& s) :Person(s), _num(s._num)
{}
protected:
int _num;
};
int main()
{
Student s1("xiaowang",999);
Student s2(s1);
}
赋值:子类的operator=必须调用父类的operator=完成赋值
class Student : public Person
{
public:
Student(const char* name = "Bob", int num = 1):Person(name),_num(num)
{}
Student(const Student& s) :Person(s), _num(s._num)
{}
Student& operator=(const Student& s) {
if (this != &s) {
this->Person::operator=(s);//注意调用的是父类的operator=()
_num = s._num;
}
return *this;
}
protected:
int _num;
};
int main()
{
Student s1("xiaowang",999);
Student s3;
s3 = s1;
}
析构:对于析构函数,其实所有类的析构函数的名字最终统一会被被处理为~destuctor(多态部分知识),因此子类和父类的构造函数会构成隐藏,那么就要指定类进行调用
但是这样会导致父类被析构两次
所以子类的析构函数会在调用完成之后自动调用父类的析构函数,这样就能满足子类先析构,父类后析构的原则
以上是关于8-4:C++继承之子类的默认构造函数如何使用的主要内容,如果未能解决你的问题,请参考以下文章