類中靜態成員與友元
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