1. 程式人生 > >C++:面向對象

C++:面向對象

ati 實例 同名 ray area 系統 eight 空字符串 wstring

面向對象的特性

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++:面向對象