目錄
類的數據成員和成員函數
class 類名 { //類體 private: //<私有數據成員,私有成員函數> int s; //數據成員 void print(){cout<<"成員函數";} public: //<公有數據成員,公有成員函數> protected: //<保護型數據成員,保護型成員函數> }
- 私有成員(private)數據只能在類中的成員函數中使用,私有成員函數只能被類中其他成員函數調用,私有成員不能通過對象使用。類成員默認權限爲private。
- 公有成員(public)可以在類中使用,也可以通過對象直接使用。
- 保護型成員(protected)可以在類體中使用,也可以在派生類中使用,但不能在其他類通過對象使用。
在類體之外定義成員函數
類體中只保留成員函數的原型聲明。也稱爲外聯函數。可以訪問操作私有成員數據。
返回類型 類名 ::成員函數名(參數表){函數體}
內聯函數
程序編譯時將函數代碼插入函數調用處。
- 在類體中定義函數體的成員默認爲內聯函數。
- 可以使用inline關鍵字定義內聯函數(在類體之外定義函數體的成員函數)
class Sum { private: int s; public: int m; void change(){s=0;} void setSum(int x); //成員函數的原型聲明 void print(); }; //這裏有一個分號 Sum :: setSum(int x) //::爲作用域解析運算符,實現成員函數 { s=x; } inline void Sum :: print(int x) { s=x; cout<<"s的值爲"<<s; }
對象的創建
對象是類的實例化,定義一個類的對象:類名 對象名;
類成員的訪問
- 對象名.公有數據成員名;
- 對象名.公有成員函數名(實參表);
Sum a; a.m=3; a.print(8);
構造函數和析構函數
- 構造函數作用在對象被創建時使用特定的值構造對象,將對象初始化一個特定的狀態。名字必須與其所屬的類名相同,並聲明爲公有成員函數,且沒有任何類型的返回值。
- 作爲類的一個成員函數,具有一般成員函數所有的特性,可以訪問類的所有數據成員,可以是內聯函數,可以帶參數(參數在定義對象是帶上),還可以帶默認的形參值。
- 可以重載,重載的構造函數之間以所帶參數的個數或類型的不同而區分。
class Sum { private: int m; public: Sum(){m=0;} //沒有返回值 Sum(int x); //成員函數的原型聲明 ~Sum(){cout<<"調用析構函數\n";} }; //這裏有一個分號 Sum :: Sum(int x) { m=x; } void main(){ Sum a1; Sum a2(10); }
析構函數作用在類對象生命週期結束時,清理和釋放類對象所佔用的系統資源。析構函數有所屬類同名,函數名前加一個邏輯非運算~,表示構造函數的逆。一個類中只能定義一個析構函數。
複製構造函數
具有一般構造函數所有的屬性,創建新對象時被調用,其形參是本類的對象的引用。作用是用一個存在的對象初始化另一個正創建的同類對象,將已知對象的數據成員的值複製給另一個正在創建的另一個同類的對象。
- 函數名與類名同名(也是一種構造函數),不指定返回類型。
- 只有一個參數,並且是對某對象的引用。
- 每個類都必須有一個複製初始化構造函數(若沒有說明,編譯系統會自動生成一個)。
class Sum { private: int s; public: void print(){cout <<"s爲:"< Sum(int x,int y){s=x*y;} Sum(Sum &p){s=2*p.s;}; //沒有返回值 ~Sum(){cout<<"調用析構函數\n";} }; void main(){ Sum a1(2,3); Sum a2(a1); a2.print(); }
對象指針
指向對象的指針,對象指針就是存放該對象地址的變量。
類名 *對象指針名;
用指針訪問對象成員時用“->”運算符:對象指針名->類成員名;或(*對象指針名).類成員名;
this指針
類成員變量和類成員函數相同時用"this->"區別,指向調用成員函數對象的一個特殊的指針。
class Test { private: int x; public: int m; void setX(int m){this->m=m;} } void main() { Test t,*p; p=&t; //通過地址賦值,使指針p指向對象t t.setX(10); cout<<"通過指針訪問的m的值:"<<p->m<<endl; }
靜態類成員
某類所有對象的靜態數據成員都共用同一個存儲空間,即靜態數據成員被類的所有對象共享。
- static聲明的靜態成員在編譯時分配存儲空間,直到整個程序執行完才撤銷。
- static靜態成員的初始化是在編譯時進行的,一般在定義static靜態成員時要給出初始值。
靜態數據成員的聲明,初始化與訪問
static 數據類型 靜態數據成員名; 數據類型 類名::靜態數據成員名=初值; //必須在類外初始化 類名::靜態數據成員名; //在類外只能通過類名訪問(被聲明爲私有成員時,只能在類內直接引用)
#include using namespace std; class Student { private: int id; static int sum; public: Student(int id){this.id=id;sum++;} void printSum(){cout<<"學生總數:"<<sum}; } int Student :: sum=0; void main() { Student stu1(1),stu(2),stu(3); stu1.printSum(); }
靜態成員函數
可以直接引用該類的靜態數據和成員函數,不能引用非靜態數據成員(要引用必須通過對象名來引用)。公有的靜態函數成員可以通過類名或函數名來調用(非靜態的只能通過對象名調用)。定義靜態成員函數:
static 返回類型 函數名(參數表){函數體}
引用:類名::靜態成員函數名(實參表) 或 對象名.靜態成員函數名(實參表)
- 靜態成員函數無this指針
- 訪問的基本上是靜態數據成員或全局變量
- 在調用靜態成員函數的前面,必須有對象名或類名
#include using namespace std; class Student { private: int id; static int sum; public: Student(int id){this.id=id;sum++;} void static printSum(){cout<<"學生總數:"<<sum; } int Student :: sum=0; void main() { Student stu1(1),stu(2),stu(3); stu1.printSum(); Student ::printSum(); }
動態內存分配
new運算實現動態內存分配,其創建的對象是一個指向該區域的地址指針變量。
類名 *指針對象名; 指針對象名 = new 構造函數(參數列表);
運算符delete用來刪除由new建立的對象,釋放指針所指向內存的空間,此時該對象的析構函數將被調用。
delete 指針對象名; class Student { private: int id; public: Student(int id){this.id=id;} void static printSum(){cout<<"學生id:"<<id; ~Student(){cout<<"對象將被銷燬";} } void main() { Student *p; p=new Student(1); p->printSum(); delete p; //釋放對象調用析構函數 }
基本數據類型動態分配內存區域
指針變量 = new 數據類型(初值列表); delete 指針變量;
int *pi; pi=new int; *pi=3; cout<<pi; //pi爲3的地址 cout<<*pi; //*pi爲int數據的值 爲數組對象動態分配內存區域 指針變量 = new 對象類型名[數組容量]; delete[] 指針變量; int *p; p=new int[3]; delete [] p;