注:以下為個人見解,有可能錯誤,歡迎批評指出!
C++的成員分類:
-
按照成員在類中扮的角色分:
數據成員、成員函數。
-
按照成員自身的使用特性分://特性:特殊性質
普通成員、靜態成員、常量成員、友元、對象成員
下以成員自身使用特性來分別介紹
一、普通成員
即前面所學,不再做介紹。
二、靜態成員
A.靜態數據成員
定義格式:static 類型 數據成員名表;//數據成員名表即(一個到多個)變量
說明:
-
- 一般在類中定義為私有成員、保護成員。
- 初始化(分配內存空間):應該在程序開始運行時即生成,必須在任何函數在外進行初始化。
格式:類型 類名::靜態數據成員名=初值 //格式類似類外成員函數定義,static 不用管了,不允許使用 - 靜態數據成員在一個類(類是定義的對象的集合)中只有一個,屬於所有對象,為所有對象所共享。
如:普通數據成員在一個類中可以有多。 ob1.x ob2.x 兩個x數據成員(同名)均屬於同一類。 - static 只是聲明用,在類外不允許再用static
代碼:只為說明靜態數據成員的定義和初始化
1 #include<iostream> 2 using namespace std; 3 class counter 4 { 5 private: 6 static int count;//靜態數據成員的定義 7 }; 8 int counter::count=100;//靜態數據成員的初始化
B.靜態成員函數
定義格式:在成員函數前加上static即可
調用方法:
①類名::靜態成員函數名(實參表);
②對象名.靜態成員函數名(實參表);
注:更偏愛①,更能說明靜態成員函數屬於類而不是屬於哪個對象。
說明:
-
- 靜態成員函數只能專門訪問靜態數據成員。
- static 只是聲明用,在類外定義靜態成員函數時不允許再用static。
- 通常用靜態成員函數來處理靜態數據成員。
代碼:只為說明靜態成員函數的定義
1 #include<iostream> 2 using namespace std; 3 class simple 4 { 5 private: 6 static int v1,v2,v3; 7 public: 8 static void sum(void) //靜態成員函數的定義 9 { 10 v3=v1+v2; 11 } 12 }; 13 int simple::v1=0; 14 int simple::v2=0; 15 int simple::v3(0);
1 #include<iostream> 2 using namespace std; 3 class simple 4 { 5 private: 6 static int v1,v2,v3; 7 public: 8 static void sum(void); //靜態成員函數在類內的聲明 9 }; 10 int simple::v1=0; 11 int simple::v2=0; 12 int simple::v3(0); 13 void simple::sum(void) //在類外的定義 14 { 15 v3=v1+v2; 16 }
三、常量成員
常量成員(或對象)的關鍵就在常量二字,一經 定義 確定 ,其值不能更改。
A.常量成員函數
定義:與普通成員函數類似,在后加const(即使在類外定義也要加const)
說明:
1. 用於處理常量對象。
2. 可憑借const構成重載即使參數完全一樣。(注:重載是參數的不同)
B.常量數據成員(C中學過、不再贅述)
定義:與普通數據成員類似,只需在成員名前加const即可,位置有兩個。
C.常量對象(霧:大概率不是類中成員,在類外定義,除非是容器類)
定義:與普通對象定義類似,只需在成員名前加const即可,位置有兩個。
1. const Myclass ob;
2. Myclass const ob; //Myclass 是類名
說明:
1. 常量對象定義時初始化后,數據成員的值不能更改。(常量性)
2. 需要常量函數才可操作常量對象。
四、友元
A.友元函數
作用:實現了非該類的函數可以訪問該類的私有成員。
注:訪問私有成員:只有該類的函數才可以訪問私有成員。
方法:在類中聲明,寫上允許訪問私有成員的函數,前加friend
1 #include<iostream> 2 #include<string.h> 3 using namespace std; 4 class girl 5 { 6 private: 7 char*name; 8 int age; 9 public: 10 girl(char*na,int n) 11 { 12 name=new char[strlen(na)+1]; 13 if(name!=NULL) 14 { 15 strcpy(name,na); 16 } 17 age=n; 18 } 19 ~girl(void) 20 { 21 delete []name; 22 } 23 friend void disp(girl&g); //此處為友元函數的聲明 24 } ;
B.友元類
作用:實現了非該類的某一類(例如類A)的所有函數可以訪問該類的私有成員。
方法: eg. friend class A;即為A中的所有成員函數均可以訪問該類的私有成員。
五、容器類(包含對象成員)
容器類:含對象成員的類稱為容器類
A.容器類的構造函數
類名(形參表):對象名1(參數表1),……,對象名n(參數表n)
B.關於容器類的一些說明
創建容器類時先執行對象成員的構造函數,再執行容器類的構造函數。
析構時遵循先定義后釋放。
代碼

1 #include<string.h> 2 #include<hdate.h> 3 class person 4 { 5 private: 6 char *name; 7 char sex[2]; 8 Date birthday; //處理數據用已知的類,不必事事都到底層 9 public: 10 person(*na,*s,int y,int m,int d):birthday(y,m,d) //容器類的構造函數 11 { 12 name=new char[strlen(na)+1]; //在容器類構造函數內部,不必對對象成員初始化(在對象所屬類已經初始化) 13 if(name!=NULL) 14 { 15 strcpy(name,na) 16 } 17 strcpy(sex,s); 18 } 19 ~person(void) 20 { 21 delete []name; 22 } 23 char *get_name(void) 24 { 25 return(name); 26 } 27 char *get_sex(void) 28 { 29 return(sex); 30 } 31 int get_year(void) 32 { 33 return(birthday.get_year()); 34 } 35 int get_month(void) 36 { 37 return(birthday.get_month()); 38 } 39 int get_day(void) 40 { 41 return(birthday.get_day()); 42 } 43 void print(void); 44 } 45 void person::print(void) 46 { 47 cout<<"姓名:"<<name<<endl; 48 cout<<"性別:"<<sex<<endl; 49 cout<<"出生日期:"<<birthday.get_year()<<"年"; 50 cout<<birthday.get_month()<<"月"; 51 cout<<birthday.get_day()<<"日"<<endl; 52 }