C++筆記(十七)——類物件作為成員
阿新 • • 發佈:2018-12-26
一、定義:
在類定義中定義的資料成員一般都是基本的資料型別。但是類中的成員也可以是物件,叫做物件成員。使用物件成員時需要注意的問題是建構函式的定義方式,及類內部物件的初始化問題。
含有物件成員的類,其建構函式和不含物件成員的建構函式有所不同,例如有以下的類:
class CXaa
{
類名1 成員名1; //即成員名1是在類1中定義的
類名2 成員名2; //成員名2是在類2中定義的
...
};
一般來說類CXaa的建構函式的定義形式為:
CXaa(引數表0):成員名1(引數表1),成員名2(引數表2),...,成員名n(引數表n) { //函式體 };
注:
- 當呼叫建構函式CXaa::CXaa()時,首先按各物件成員在類定義中的順序依次呼叫它們的建構函式,對這些物件初始化,最後再執行CXaa::CXaa()的函式體
- 解構函式的呼叫順序與此相反
- 物件成員的初始化列表一般來自引數表0
#include <iostream> #include <string> using namespace std; class CClass_Obj //設定姓名 { char *str; public: CClass_Obj(char *s) { str = new char[strlen(s) + 1]; strcpy(str, s); cout << "構造名字\n"; } ~CClass_Obj() { cout << "折構名字\n"; delete[]str; } void print() { cout << "名字:" << str << endl; } }; class CSubject //設定科目 { char *m_str; public: CSubject(char *ss) { m_str = new char[strlen(ss) + 1]; strcpy(m_str, ss); cout << "構造科目 \n"; } ~CSubject() { cout << "折構科目" << endl; delete[]m_str; } void print() { cout << "科目:" << m_str << endl; } }; class CGirl //設定分數 { CClass_Obj m_name; //物件成員 CSubject m_sub; int m_grade;//成員變數 public: CGirl(char *st1, char *st2, int gra):m_name(st1),m_sub(st2) //注意呼叫物件成員的解構函式與普通類中的解構函式的差別 { m_grade = gra; cout << "構造分數\n"; } void print() { cout << "----------------" << endl; m_name.print(); //注:要在呼叫類物件成員的類中呼叫該函式 m_sub.print(); cout << "分數:" << m_grade << endl; cout << "----------------" << endl; } ~CGirl() { cout << "折構分數\n"; } }; int main() { { CGirl aa("Zhang Hao","語文", 23); aa.print(); //呼叫CGirl的print函式 } getchar(); return 0; }
結果:
具體原理如下圖:
說明;
- “Zhang Hao”是new空間在堆中開闢的出來的,所以是在外界的
- CGirl類物件在呼叫建構函式進行初始化的同時,也要對物件成員進行初始化,因為它也是屬於此類的成員。因此在寫類CGirl的建構函式時,也綴上了對物件成員的初始化:
CGirl(char *st1, char *st2, int gra):m_name(st1),m_sub(st2)
於是在呼叫CGirl的建構函式進行初始化時,也給物件成員m_name賦初值。
- 這裡需要注意的是:在定義類CGirl的建構函式時,必須綴上其物件成員的名字m_name,而不能綴上類名。即:
CGirl(char *st1, char *st2, int gra):CClass_Obj(st1),CSubject(st2)
是錯誤的,因為在類CGirl中是類CClass_Obj的物件m_name作為成員,而不是類CClass_Obj作為其成員。