C++派生类的构造函数和析构函数
生活随笔
收集整理的這篇文章主要介紹了
C++派生类的构造函数和析构函数
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
C++派生類的構(gòu)造函數(shù)和析構(gòu)函數(shù)
派生類的構(gòu)造函數(shù)和析構(gòu)函數(shù)
#include <iostream> using namespace std; class student { public: student(int num,char* n):number(num),name(n){} ~student(){cout << "student deconstruted" << endl;} protected: int number; char* name; }; class student1:public student { public: student1(int num,char* n,bool s,int a):student(num,n),sex(s),age(a){} void show(); ~student1(){cout << "student1 deconstruted" << endl;} protected: bool sex; int age; }; void student1::show() { cout << "num: " << number << endl; cout << "name: " << name << endl; cout << "age: " << age << endl; cout << "sex: " << sex << endl; } int main() { student1 stu(45,"shukai",true,20); stu.show(); return 0; } 1.1派生類構(gòu)造函數(shù)的一般形式為: 派生類構(gòu)造函數(shù)名(總參數(shù)表列):基類構(gòu)造函數(shù)名(參數(shù)表列) {派生類新增加的成員的初始化語句} 1.2對派生類新增加的成員可以用初始化表進(jìn)行初始化。如: student1(int num,char* n,bool s,int a):student(num,n),sex(s),age(a){} 1.3在類中對派生類構(gòu)造函數(shù)做聲明時,不包括基類構(gòu)造函數(shù)名以及參數(shù)表列(student(num,n)),只在定義函數(shù)時將它列出。 1.4建立一個對象時,執(zhí)行構(gòu)造函數(shù)的順序: A.派生類構(gòu)造函數(shù)調(diào)用基類的構(gòu)造函數(shù)。 B.再執(zhí)行派生類構(gòu)造函數(shù)體本身(即派生類構(gòu)造函數(shù)的函數(shù)體)有子對象的派生類構(gòu)造函數(shù)
#include <iostream> using namespace std; class student { public: student(int n,char* nam):num(n),name(nam){} void display(){cout << name << " " << num << endl;} protected: int num; char* name; }; class student1:public student { public: student1(int n,char* nam,int n1,char* nam1,int a,bool s):student(n,nam), monitor(n1,nam1),age(a),sex(s){} void display1(); void display_monitor(); private: int age; bool sex; student monitor; }; void student1::display1() { cout << "student is " << endl; display(); cout << age << " " << sex << endl; } void student1::display_monitor() { cout << "monitor is " << endl; cout << age << " " << sex << endl; } int main() { student1 stu(45,"shukai",1,"abc",20,true); stu.display1(); stu.display_monitor(); return 0; }1.1類的數(shù)據(jù)成員除了標(biāo)準(zhǔn)成員,如(int,char)或系統(tǒng)提供的類型(如string),實際上,類的數(shù)據(jù)成員中還可以包含類對象,如可以聲明一個類時包含這樣的數(shù)據(jù)成員: Student s1; 這時,s1就是類對象中的內(nèi)嵌對象,稱為子對象(subobject)。 1.2派生類構(gòu)造函數(shù)的任務(wù)應(yīng)該包括3部分: A.對基類成員的初始化 B.對子對象數(shù)據(jù)成員的初始化。 C.對派生類數(shù)據(jù)成員的初始化。 1.3定義派生類構(gòu)造函數(shù)的一般形式為:
派生類構(gòu)造函數(shù)名(總參數(shù)表列);基類構(gòu)造函數(shù)名(參數(shù)表列),子對象名(參數(shù)表列) {派生類中新增數(shù)據(jù)成員的初始化語句} 如:student1(int n,char* nam,int n1,char* nam1,int a,bool s):student(n,nam),monitor(n1,nam1),age(a),sex(s){} 只不過派生類中的新生成員用初始化列表來進(jìn)行初始化而已。 1.4基類構(gòu)造函數(shù)和子對象的次序是可以任意的,如上面的構(gòu)造函數(shù)可以寫成: student1(int n,char* nam,int n1,char* nam1,int a,bool s):monitor(n1,nam1),student(n,nam),age(a),sex(s){}
編譯系統(tǒng)是根據(jù)相同的參數(shù)名,而不是根據(jù)參數(shù)的次序來傳遞數(shù)據(jù)的。
多層派生時的構(gòu)造函數(shù)
#include <iostream> #include <string> using namespace std; class student { public: student(int n,string nam){num=n;name=nam;} void display(){cout << "num: " << num << " name: " << name << endl;} protected: int num; string name; }; class student1:public student { public: student1(int n,string nam,int a):student(n,nam),age(a){} void display1(){display();cout << "age: " << age << endl;} protected: int age; }; class student2:public student1 { public: student2(int n,string nam,int a,bool s):student1(n,nam,a),sex(s){} void display2(){display1();cout << "sex: " << sex << endl;} protected: bool sex; }; int main() { student2 stu(45,"shukai",20,true); stu.display2(); return 0; } 1.1 student2的構(gòu)造函數(shù)為student2(int n,string nam,int a,bool s):student1(n,nam,a),sex(s){},注意不必列出每一層的構(gòu)造函數(shù),只要列出上一層的構(gòu)造函數(shù)即可。派生類構(gòu)造函數(shù)的特殊形式
1.1當(dāng)不需要對派生類新增成員做任何初始化操作的時候,派生類構(gòu)造函數(shù)的函數(shù)體可以為空,即構(gòu)造函數(shù)是空函數(shù)。 1.2如果在基類中沒有構(gòu)造函數(shù)或者定義了沒有參數(shù)的構(gòu)造函數(shù),那么在定義派生類的構(gòu)造函數(shù)時可以不必寫基類的構(gòu)造函數(shù)。派生類的析構(gòu)函數(shù)
1.1析構(gòu)函數(shù)與派生類的構(gòu)造函數(shù)相反,構(gòu)造函數(shù)是先構(gòu)造基類在構(gòu)造子對象再構(gòu)造派生類,而析構(gòu)時,先對派生類析構(gòu),再對子對象析構(gòu),然后再對基類析構(gòu)。總結(jié)
以上是生活随笔為你收集整理的C++派生类的构造函数和析构函数的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 微调多层自编码算法
- 下一篇: 使用一个环境的或者半径异样消除器来进行异