面向對象四大特徵:
特徵 說明 類比
抽象 抽出具體事物的普遍性的本質 分門別類:鳥類、哺乳類、魚類
封裝 把數據與處理(函數)包在一起 通信錄(增加、刪除)
繼承 數據與處理(函數)的傳承 財富與絕技、混血兒(膚色/頭髮、 兩種語言
多態 同一個事物(函數)的多種形態 手機鍵盤數字與字母、 電腦鍵盤功能鍵
類的定義:
與C/C++中的struct類似
class 類名{
成員變量和成員函數的聲明;
};
PS:class定義最後要加“;”。
構成:
構成 作用
數據成員/成員變量/屬性 對象內部數據和狀態,只能在類定義中聲明,可以在成員函數中直接調用。
成員函數/方法 對象相關的操作,可以在類內實現或類外實現。
作用域運算符:
::——函數歸屬。
訪問限定符:
限定符 作用
private[默認] 私有
public 公開
protected 保護
時間中,成員變量多數情況使用private或者protected;成員函數多數情況下使用public。通常。通過成員函數改變對象的成員變量。聲明與實現分離
頭文件(,h文件)——聲明
即將類的聲明放到頭文件中。
方式:
#pragma once
#ifnde...#endif
上面任選其一即可。作用——防止頭文件二次編譯。
源文件(.cpp文件)——實現
即將類的實現放到源文件中。
引用頭文件:
#include <>(標準庫函數)
#include ""(自定義/第三方函數)
上面任選其一即可。class與struct的區別:
1.默認的訪問控制不同(主要)
struct是public(共有——類外可以調用)class是private(私有——類外不可調用)
2.初始化不同
struct可以使用花括號內的初始值列表{...}初始化,class不可以(C++98不可以,C++11可以)。PS:
成員變量默認初始化爲隨機值(主要影響指針)。C++的struct可以有成員函數,而C不可以。
C++的struct可以使用訪問控制關鍵字(public private protected),而C不可以。
對象的創建:
1.直接定義:
類作爲類型定義變量——棧上創建。
類名 對象1;// 調用默認構造函數
類名 對象2 = 對象1;// 調用複製構造函數
類名 對象3(對象1);// 調用複製構造函數
2.動態創建:
堆上創建。
類名* 對象指針 = new 類名;// 調用默認構造函數
delete 對象指針;
int* p = new int[10];
delete p;// 只釋放p[0]
delete [] p;// 釋放全部數組
基本類型的初始化新增語法:
int a(0);// 等價 int a = 0;
const float b(1.0);// 等價 const float b = 1.0;
注意:
空結構體與空類的大小(sizeof)爲1,主要在於初始化/實例化時,編譯器給變量/對象分配內存(地址),內存最小單位爲1個字節。通常,sizeof(類型) == sizeof(變量)。C++除了特殊情況,很少直接使用malloc()/free()申請釋放內存,取而代之的是new/delete。
this指針
作用域——類的內部。特點:
1.類的一個自動生成,自動隱藏的私有成員。
2.每個對象僅有一個this指針。
3.當一個對象被創建時,this指針就存放了指向對象數據的首地址。
4.不是對象本身的一部分,不會影響sizeof(對象)的結果。
5.如果成員函數形參與成員變量同名,使用this->作爲成員變量的前綴來區分。
構造函數
語法:
類名(參數){
函數體;
};
在對象被創建時自動執行;
構造函數的函數名與類名相同;
沒有返回值類型,也沒有返回值;
可以有多個構造函數。
調用時機
1.對象直接定義創建(構造函數不能被顯式調用);
2.new動態創建。
默認構造函數
類中沒有顯式的定義任何構造函數,編譯器就會自動爲該類生成默認構造函數。
構造函數的3個作用
1.給創建的對象建立一個標識符;
2.爲對象數據成員開闢沒存空間;
3.完成對象數據成員的初始化。
初始化列表
類名(參數):成員變量(參數){
函數體;
};
作用
初始化非靜態成員變量。
說明
從概念上來說,構造函數的執行可以分成兩個階段:初始化階段和計算階段(函數體中的賦值)。初始化階段先於計算階段。
必須使用初始化列表的情況
1.常量成員,因爲常量只能初始化不能賦值,所以必須放在初始化列表裏面。
2.引用類型,引用必須在定義的時候初始化,並且不能重新賦值,所以也要寫在初始化列表裏面。
3.沒有默認構造函數的類型,因爲使用初始化列表可以不必調用默認構造函數來初始化,而是直接調用拷貝構造函數初始化。
成員變量初始化順序
成員變量在使用初始化列表初始化時,與構造函數中初始化成員列表的順序無關,只與定義成員變量的順序有關。
C++的函數可以增加默認參數。
寫法:默認參數必須寫在函數聲明中,不能寫在函數實現的參數列表中中。
默認參數必須寫在所有非默認參數的後面。
默認參數可以寫任意多個。
使用:
默認參數可以不用傳遞值,此時,使用默認值。
默認參數可以傳值,此時,使用實參值。
代碼例子
class Complex{
public:
Complex():real(0),imag(0){
//this->real = 0;
//this->imag = 0;
}
Complex(float real,float imag):real(real),imag(imag){
//this->real = real;
//this->imag = imag;
}
~Complex(){
}
void print();
Complex add(const Complex& other);
Complex subtract(const Complex& other);
Complex operator+(const Complex& other)const;
Complex operator-(const Complex& other)const;
friend ostream& operator<<(ostream& out,const Complex& c);
private:
float real;
float imag;
};
析構函數
~類名(){
函數體
}
語法
析構函數的函數名與類名相同;
函數名前必須有一個~;
沒有參數;
沒有返回值類型和返回值;
只能有一個析構函數。
調用時機
1.對象離開作用域;
2.delete函數調用時。
默認析構函數
類中沒有顯式的定義析構函數,編譯器就會自動爲該類型生成默認析構函數。作用
釋放對象所申請佔有的資源。引用(別名)
聲明
const 類型名& 對象名/類型名& 對象名
使用
與對象變量,基本類型變量一樣。
作用
取代指針
引用於指針的區別
引用與指針的區別
指針指向一塊內存,它的內容是所指內存的地址;引用是某塊內存的別名。
引用只能在定義時被初始化一次,之後不可變;指針可變;
引用不能爲空,指針可以爲空;
引用使用時無需解引用*,指針需要解引用(*p);
sizeof()引用得到的是所指向的變量/對象的大小,而sizeof 指針得到的是指針本身的大小;
引用通常用於兩種情形:成員變量和函數的參數列表。拷貝/複製構造函數
語法(3種形式)
類名(類名& 形參){
函數體
}
類名(const 類名& 形參){
函數體
}
類名(const 類名 形參){
函數體std:swap();
}
調用時機
一個對象作爲函數參數,以值傳遞的方式傳入函數體一個對象作爲函數返回值,以值從函數返回
一個對象用於給另外一個對象進行初始化(賦值初始化)
代碼示例
Bill::Bill(const Bill& b):name(NULL),price(b.price),count(b.count),discount(b.discount){
name = new char[strlen(b.name)+1];
strcpy(name,b.name);
}
默認拷貝構造函數
本質:內存拷貝作用:複製一個已經存在的對象