c++ 概念

1、類和對象

類是一種複雜的數據類型,它是將不同類型的數據和與這些數據相關的操作封裝在一起的集合體。

類的結構(也即類的組成)是用來確定一類對象的行爲的,而這些行爲是通過類的內部數據結構和相關的操作來確定的。這些行爲是通過一種操作接口來描述的(也即平時我們所看到的類的成員函數),使用者只關心的是接口的功能(也就是我們只關心類的各個成員函數的功能),對它是如何實現的並不感興趣。而操作接口又被稱爲這類對象向其他對象所提供的服務。

類的一般定義格式如下:
class <類名>
{
 public:    <成員函數或數據成員的說明>
 private:    <數據成員或成員函數的說明>
};    <各個成員函數的實現>

c++提供了類class機制,定義類的格式與struct相像。

class date {

public:

  void set( int y, int m, int d);

private: 

  int year, month, day;

};

定義一個類就相當於創建了一個新的class類型。要使用類,還必須用已經定義的類去說明它的實例變量(即對象)。在C++中,class類型一旦被定義,它的實例變量(對象)就能被創建,並初始化,且能定義指針變量指向它。實例化的類就是對象。

date d;d就是一個對象;

 

2、封裝、繼承、多態

封裝就是將抽象得到的數據和行爲(或功能)相結合,形成一個有機的整體,也就是將數據與操作數據的源代碼進行有機的結合,形成“類”,其中數據和函數都是類的成員。

封裝的目的是增強安全性和簡化編程,使用者不必瞭解具體的實現細節,而只是要通過 外部接口,一特定的訪問權限來使用類的成員。

例如,在抽象的基礎上,我們可以將時鐘的數據和功能封裝起來,構成一個時鐘類。
按c++的語法,時鐘類的聲明如下:

class Clock
{
public : //共有成員,外部藉口
void SetTime ( int NewH , int NewM , int NewS ) ;
void ShowTime () ;
private : //私有成員,外部無法訪問
int Hour , Minute , Second ;
}


可以看到通過封裝使一部分成員充當類與外部的接口,而將其他的成員隱蔽起來,這樣就達到了對成員訪問權限的合理控制,使不同類之間的相互影響減少到最低限度,進而增強數據的安全性和簡化程序的編寫工作。

 

繼承面向對象軟件技術當中的一個概念。如果一個類A繼承自另一個類B,就把這個A稱爲“B的子類”,而把B稱爲“A的父類”。繼承可以使得子類具有父類的各種屬性和方法,而不需要再次編寫相同的代碼。在令子類繼承父類的同時,可以重新定義某些屬性,並重寫某些方法,即覆蓋父類的原有屬性和方法,使其獲得與父類不同的功能。

 

多態:一個操作隨着所傳遞或捆綁的對象類型的不同能夠做出不同的反應,其行爲模式稱爲多態。解決這個問題就是使用虛函數機制。基類與派生類的同名操作,只需要標記上virtual,則該操作便具有多態性。純虛函數不能作爲對象使用。

 

3、重載函數(操作符重載operator)

所謂函數重載就是函數名一樣,根據參數類型進行操作。只要參數個數、類型、順序不同,函數就可以重載。然而,返回類型不同則不允許函數重載。還可以使用默認參數,但是匹配的時候是從右往左,中間不能有遺漏。

 

4、函數模版

函數模版的定義形式:

template <類型參數表>

返回類型 函數模板名(數據參數表)

{

函數模版定義體

}

例如:

template <typename T>

void swap(T a, T b)

{

    T temp = a; a = b; b = temp;

}

typename比class後推出,type包含內部數據類型和用戶定義類型class、struct、union、enum。從意義上說,type比class更準切。

 

5、內聯函數

內聯函數的功能和預處理宏的功能相

爲什麼要使用宏呢?因爲函數的調用必須要將程序執行的順序轉移到函數所存放在內存中的某個地址,將函數的程序內容執行完後,再返回到轉去執行該函數前的地方。這種轉移操作要求在轉去執行前要保存現場並記憶執行的地址,轉回後要恢復現場,並按原來保存地址繼續執行。因此,函數調用要有一定的時間和空間方面的開銷,於是將影響其效率。而宏只是在預處理的地方把代碼展開,不需要額外的空間和時間方面的開銷,所以調用一個宏比調用一個函數更有效率。但是使用宏只是字符串的替換,而內聯函數剛好解決這個問題,使用inline函數最好不存在循環,代碼量少。

6、名字空間

提到名字空間,就是講到作用域的問題。

定義格式:

namespace name{

  名稱聲明或定義

}

 

7、this指針

一個對象的this指針並不是對象本身的一部分,不會影響sizeof(對象)的結果。this作用域是在類內部,當在類的非靜態成員函數中訪問類的非靜態成員的時候,編譯器會自動將對象本身的地址作爲一個隱含參數傳遞給函數。也就是說,即使你沒有寫上this指針,編譯器在編譯的時候也是加上this的,它作爲非靜態成員函數的隱含形參,對各成員的訪問均通過this進行。

  例如,調用date.SetMonth(9) <===> SetMonth(&date, 9),this幫助完成了這一轉換 .

 

8、引用

所謂的引用就是相當於另外起一個名字。

 

9、構造函數和析構函數

所謂的構造函數就是跟類同名,沒有返回值,析構函數在類名字前加~。析構函數還可以進行重載。

 

10、new和malloc、delete和free構造和析構

new在c++中是關鍵字,malloc是函數。

new在分配的時候有初始化,malloc沒有。

用new分配的對象會調用對象的構造函數,delete則會調用對象的析構函數。

而malloc和free從不調用構造和析構函數,他們只是簡單的分配內存。

兩者都是分配在堆區。

 

11、異常

 

12、c++模版

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章