1. 程式人生 > >類中靜態成員與友元

類中靜態成員與友元

8.11靜態成員

使用關鍵字static。初始化靜態成員資料必須在類外進行。

8.11.1靜態成員資料

它是一個類的物件共享的資料成員,而不僅僅是某一物件的成員資料。例如班級名和班級人數就可以定義為學生類的靜態成員資料。

它與一般成員資料的區別在於:對於靜態成員資料,該類的每一個物件都共享唯一的資料,即它只存在一份拷貝;而對於一般成員資料,該類的每個物件都獨立建立自己一個副本,以儲存各自特定的值。

在Student類中定義靜態成員資料int Student::count=0;當定義靜態成員資料時不能同時進行初始化,如static int count=0是錯誤的。

8.11.2靜態成員函式

它也稱為類成員函式。

定義一個靜態成員函式printCount(),在該函式中訪問靜態成員資料count。從類的外邊訪問公有靜態成員資料,有兩種形式:

物件名.公有靜態成員函式;

類名::公有靜態成員函式;

分別對應的程式碼為

stu.printCount();

Student::printCount();

類的內部的成員函式和成員資料相互訪問的關係:

一般成員函式可以訪問任何型別的函式和資料,而靜態成員函式只可以訪問靜態成員函式和資料。

8.12友元

靜態成員資料提供了在同一個類的所有物件之間共享的機制,而友元則是不同類的成員函式之間、類的成員函式和一般函式之間進行資料共享的機制。友元的引入破壞了類的資料封裝性和隱蔽性,因此,在面向物件的程式設計方法中不提倡使用友元機制。

它可以定義在函式級別,也可以定義在函式類級別。

8.12.1友元函式

定義友元函式,使用關鍵字friend。一般函式printStudent()宣告為類Student的友元函式,則該函式可以訪問類Student的私有成員id,name&age ,方式為printStudent(stu),先宣告一個物件Student stu(1,”li”,’F’);

8.12.2友元類

如果一個類的所有成員函式都需要宣告為另一個類的友元函式,則友元函式的做法就顯得繁瑣。一個更為簡單的做法就是宣告為友元類,即將一個類宣告為另一個類的友元函式。例如:

Class Administrator

{....};

Class Student

{

friend class Administrator;

};

 例子:

#include<iostream>
#include<cstring>
using namespace std;
class Administrator
{
	public:
		void createStudent(int pId);
} ;
class Student{
	public:
		Student(int pId,char* pName,char pSex);
		~Student();
		friend void printStudent(Student& pStudent);
		friend void Administrator::createStudent(int pId);
		private:
		int id;
		char* name;
		char sex; 
};
void Administrator::createStudent(int pId)
{
	Student stu(1,"wang",'M');
	stu.id=pId;
//	name=new char[strlen(pName)+1]; 
cout<<"id: "<<stu.id<<","<<"name: "<<stu.name<<","<<"sex: "<<stu.sex<<endl;
}
Student::Student(int pId,char* pName,char pSex)
{
	cout<<"construct one student."<<endl;
	id=pId;
	sex=pSex;
	name=new char[strlen(pName)+1];
	if(name!=0)
	strcpy(name,pName);
}
Student::~Student(){
	cout<<"deconstuct one student."<<endl;
	delete[] name;
}
void printStudent(Student& pStudent)
{
	cout<<"id: "<<pStudent.id<<", "<<"name: "<<pStudent.name<<", "<<"sex: "<<pStudent.sex<<endl;
}
int main()
{
	Student stu(1,"li",'F');
	printStudent(stu);
	Administrator admin;
	admin.createStudent(2);
	return 0;
}
//一般函式printStudent()宣告為類Student的友元函式,則該函式可以訪問類Student的私有成員id,name&age