子類(lèi)對(duì)象的構(gòu)造
- 子類(lèi)中可以定義構(gòu)造函數(shù)
- 子類(lèi)構(gòu)造函數(shù)
- 必須對(duì)繼承而來(lái)的成員進(jìn)行初始化
- 直接通過(guò)
初始化列表
或者賦值的方式
進(jìn)行初始 -
調(diào)用父類(lèi)構(gòu)造函數(shù)
進(jìn)行初始化
- 直接通過(guò)
- 必須對(duì)繼承而來(lái)的成員進(jìn)行初始化
- 父類(lèi)構(gòu)造函數(shù)在子類(lèi)中的調(diào)用方式
- 默認(rèn)調(diào)用
- 適用于無(wú)參構(gòu)造函數(shù)和使用默認(rèn)參數(shù)的構(gòu)造函數(shù)
- 顯示調(diào)用
- 通過(guò)
初始化列表
進(jìn)行調(diào)用 - 適用于所有父類(lèi)構(gòu)造函數(shù)
- 通過(guò)
- 默認(rèn)調(diào)用
- 父類(lèi)構(gòu)造函數(shù)的調(diào)用
class Child : public Parent
{
public:
//隱式調(diào)用
Child()
{
cout << "Child()" << endl;
}
//顯示調(diào)用
Child(string s) : Parent("Parameter to Parent")
{
cout << "Child() : " << s << endl;
}
}
舉個(gè)例子:
#include <iostream>
#include <string>
using namespace std;
class Parent
{
public:
Parent()
{
cout << "Parent()" << endl;
}
Parent(string s)
{
cout << "Parent(string s) : " << s << endl;
}
};
class Child : public Parent
{
public:
//這里隱式調(diào)用了父類(lèi)構(gòu)造
Child()
{
cout << "Child()" << endl;
}
//這里再初始化列表中顯示的調(diào)用了父類(lèi)構(gòu)造
Child(string s) : Parent(s)
{
cout << "Child(string s) : " << s << endl;
}
};
int main()
{
//初始化c時(shí),調(diào)用了不帶參數(shù)的父類(lèi)構(gòu)造
//也調(diào)用了不帶參數(shù)的子類(lèi)構(gòu)造
Child c;
//初始化cc時(shí)坟桅,調(diào)用了帶參數(shù)的父類(lèi)構(gòu)造
//也調(diào)用了帶參數(shù)的子類(lèi)構(gòu)造
Child cc("cc");
return 0;
}
運(yùn)行結(jié)果如下:
Parent()
Child()
Parent(string s) : cc
Child(string s) : cc
- 構(gòu)造規(guī)則
- 子類(lèi)對(duì)象在創(chuàng)建時(shí)會(huì)首先調(diào)用
父類(lèi)的構(gòu)造函數(shù)
- 先執(zhí)行父類(lèi)構(gòu)造函數(shù)再執(zhí)行
子類(lèi)的構(gòu)造函數(shù)
- 父類(lèi)構(gòu)造函數(shù)可以被隱式調(diào)用或者顯示調(diào)用
- 子類(lèi)對(duì)象在創(chuàng)建時(shí)會(huì)首先調(diào)用
- 對(duì)象創(chuàng)建時(shí)構(gòu)造函數(shù)的
調(diào)用順序
- 調(diào)用
父類(lèi)
的構(gòu)造函數(shù) - 調(diào)用
成員變量
的構(gòu)造函數(shù) - 調(diào)用
類(lèi)自身
的構(gòu)造函數(shù) - 口訣:
先父母
棒厘,后客人
,再自己
- 調(diào)用
舉個(gè)例子:
#include <iostream>
#include <string>
using namespace std;
class Object
{
public:
Object(string s)
{
cout << "Object(string s) : " << s << endl;
}
};
class Parent : public Object
{
public:
Parent() : Object("Default")
{
cout << "Parent()" << endl;
}
Parent(string s) : Object(s)
{
cout << "Parent(string s) : " << s << endl;
}
};
class Child : public Parent
{
Object mO1;
Object mO2;
public:
Child() : mO1("Default 1"), mO2("Default 2")
{
cout << "Child()" << endl;
}
//這里先調(diào)用Parent(s) 父類(lèi)的帶參構(gòu)造函數(shù)
//再分別調(diào)用成員變量 m01 m02 的帶參構(gòu)造函數(shù)
//最后調(diào)用自身的 帶參構(gòu)造函數(shù)
Child(string s) : Parent(s), mO1(s + " 1"), mO2(s + " 2")
{
cout << "Child(string s) : " << s << endl;
}
};
int main()
{
Child cc("cc");
return 0;
}
運(yùn)行結(jié)果如下:
Object(string s) : cc
Parent(string s) : cc
Object(string s) : cc 1
Object(string s) : cc 2
Child(string s) : cc
子類(lèi)對(duì)象的析構(gòu)
-
析構(gòu)函數(shù)
的調(diào)用順序與構(gòu)造函數(shù)相反- 執(zhí)行
自身
的析構(gòu)函數(shù) - 執(zhí)行
成員變量
的析構(gòu)函數(shù) - 執(zhí)行
父類(lèi)
的析構(gòu)函數(shù)
- 執(zhí)行
舉個(gè)例子:
#include <iostream>
#include <string>
using namespace std;
class Object
{
string ms;
public:
Object(string s)
{
cout << "Object(string s) : " << s << endl;
ms = s;
}
~Object()
{
cout << "~Object() : " << ms << endl;
}
};
class Parent : public Object
{
string ms;
public:
Parent() : Object("Default")
{
cout << "Parent()" << endl;
ms = "Default";
}
Parent(string s) : Object(s)
{
cout << "Parent(string s) : " << s << endl;
ms = s;
}
~Parent()
{
cout << "~Parent() : " << ms << endl;
}
};
class Child : public Parent
{
Object mO1;
Object mO2;
string ms;
public:
Child() : mO1("Default 1"), mO2("Default 2")
{
cout << "Child()" << endl;
ms = "Default";
}
Child(string s) : Parent(s), mO1(s + " 1"), mO2(s + " 2")
{
cout << "Child(string s) : " << s << endl;
ms = s;
}
~Child()
{
cout << "~Child() " << ms << endl;
}
};
int main()
{
//繼承順序?yàn)椋?Child->Parent->Object
//然后 Child 中有兩個(gè)Object成員變量
Child cc("cc");
cout << endl;
//所以構(gòu)造順序?yàn)?先父母
//1特幔、調(diào)用Object 帶參構(gòu)造 調(diào)用Parent 帶參構(gòu)造
//再客人
//2、調(diào)用Object 帶參構(gòu)造
//后自己
//3闸昨、調(diào)用Child 帶參構(gòu)造
//析構(gòu)順序正好相反 先自己
//1蚯斯、調(diào)用Child 析構(gòu)
//再客人
//2、調(diào)用Object 析構(gòu)
//后父母
//3饵较、調(diào)用Parent Object 析構(gòu)
return 0;
}
執(zhí)行結(jié)果如下:
Object(string s) : cc
Parent(string s) : cc
Object(string s) : cc 1
Object(string s) : cc 2
Child(string s) : cc
~Child() cc
~Object() : cc 2
~Object() : cc 1
~Parent() : cc
~Object() : cc