C++:面向對象
面向對象的特性
Abstraction(抽象)
Polymorphism(多態)
Inheritance(繼承)
Encapsulation(封裝)
類的定義
class Circle{
public:
double radius;
Circle(){
radius = 1;
}
Circle(double r){
radius = r;
}
double getArea(){
return radius*radius*3.14159;
}
};
類是一種數據類型
對象指針:用指針訪問對象成員
Circle circle1;
Circle *pCircle = &circle1;
兩者效果相同:
(*pCircle).radius
pCircle->radius
在堆上創建對象
在函數中聲明的對象都一般在棧上創建,函數返回後對象就被銷毀。為了保留對象,可以用new運算符在堆上創建它。
ClassName *pObject = new ClassName();
delect pObject; //當程序結束時動態對象會被系統銷毀,程序員也可以手動顯示銷毀
創建string對象
用無參構造函數創造一個空字符串
string newString;
用一個字符串常量創建string對象
string message("Aloha World");
用字符串數組創建string對象
char charArray[] = {‘H‘,‘e‘,‘l‘,‘l‘,‘o‘,‘\0‘};
string message1(charArray)
內建指針this:指向當前函數的調用對象
構造函數的初始化
當類的數據域是一個對象類型,而且當這個對象的類本身沒有無參構造函數時,須通過初始化列表來初始化對象。
靜態成員
可以通過類或者對象調用靜態函數,只能通過對象調用非靜態函數。
當變量或者函數不依賴於類的實例時,可以將此變量/函數定義為靜態。
析構函數
友元:通過friend聲明友元函數或者友元類,從而可以通過友元訪問private成員
拷貝構造函數(copy constructor)
ClassName(ClassName&)
喚起拷貝構造函數:
ClassName obj1(obj2);
或 ClassName obj1 = obj2; //只能在初始化時拷貝
淺拷貝:拷貝指針,而非指針所指向的內容
深拷貝:獲取原指針的內容,創建新指針,拷貝原指針指向的內容到新指針裏
定制深拷貝構造函數:
Person::Person(Person& person){
id = person.id;
Date* p = person.getBirthDate();
birthDate = new Date(*p);
}
Vector類
繼承
DerivedClass(parameterList) : BaseClass() { }
DerivedClass(parameterList) : BaseClass(argumentList) { }
多態:不同的對象對相同的消息有不同的相應
聯編:確定具有多態的語句調用哪個函數的過程
-> 靜態聯編:在程序編譯時確定調用哪個函數(函數重載)
-> 動態聯編:在程序運行時才確定調用哪個函數(運行時多態)
虛函數(virtual)
如何實現函數的動態聯編:
1)基類定義同名虛函數
2)訪問對象的成員函數時,要用指向對象的指針或者對象引用
基類與派生類中有同名函數時:
1,通過派生類對象訪問同名函數 -> 靜態聯編
2,通過基類對象的指針訪問同名函數 -> 靜態聯編
3,通過基類對象的指針訪問同名虛函數 ->動態聯編
抽象類:完全無法實例化的類
純虛函數:
在抽象類GemoetricObject裏定義函數virtual double getArea() = 0;
動態類型轉換
C++:面向對象