1. 程式人生 > >C++筆記(十七)——類物件作為成員

C++筆記(十七)——類物件作為成員

一、定義:

    在類定義中定義的資料成員一般都是基本的資料型別。但是類中的成員也可以是物件,叫做物件成員使用物件成員時需要注意的問題是建構函式的定義方式,及類內部物件的初始化問題

    含有物件成員的類,其建構函式不含物件成員的建構函式有所不同,例如有以下的類:

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作為其成員。