概念:(object oriented programming,縮寫:oop)是一種程式設計范型,同時也是一種程式開發的方法。物件指的是類的例項,將物件作為程式的基本單元,將程式和資料封裝其中,以提高軟體的重用性、靈活性和擴充套件性。
c++不是純物件導向語言,而是基於物件導向的語言
(ps:因為它包含c的部分,c是面向過程)
物件導向三大特性:封裝、繼承、多型
①類的大小(是不是很疑惑,類腫麼還有大小,不就是個型別嘛,納尼)
是的類有大小,看個栗子:
class book
;
sizeof(book);
會是多少?有沒有算出來。
其實類和我們結構體一樣是有大小的,而且類的記憶體對齊方式和結構體一樣。
②為什麼要記憶體對齊?
這個要說到作業系統上了,我們的cpu把記憶體當成是一塊一塊的,塊的大小可以是2,4,8,16 個位元組,因此cpu在讀取記憶體的時候是一塊一塊進行讀取的,塊的大小稱為(memory granularity)記憶體讀取粒度。
為什麼要分塊呢?(分塊讀取有利於提高記憶體訪問效率)
和記憶體對齊有什麼關係?
假設cpu要讀取乙個4位元組大小的資料到暫存器中(假設記憶體讀取粒度是4),分兩種情況討論:
1.資料從0位元組開始
2.資料從1位元組開始
解析:當資料從0位元組開始的時候,直接將0-3四個位元組完全讀取到暫存器,結算完成了。當資料從1位元組開始的時候,問題很複雜,首先先將前4個位元組讀到暫存器,並再次讀取4-7位元組的資料進暫存器,接著把0位元組,4,6,7位元組的資料剔除,最後合併1,2,3,4位元組的資料進暫存器,對乙個記憶體未對齊的暫存器進行了這麼多額外操作,大大降低了cpu的效能。
所以記憶體對齊就很好的提高了cpu的讀取效率。
記憶體對齊的計算?
1.第乙個成員在與結構體變數偏移量為0的位址處。
2.其他成員變數要對齊到某個數字(對齊數)的整數倍的位址處。
對齊數 = 編譯器預設的乙個對齊數 與 該成員大小的較小值。
vs中預設的值為8
gcc中的預設值為4
3.結構體總大小為最大對齊數(每個成員變數除了第乙個成員都有乙個對齊數)的整數倍。
4.如果巢狀了結構體的情況,巢狀的結構體對齊到自己的最大對齊數的整數倍處,結構體的整體大小就是所有最大對齊數(含巢狀結構體的對齊數)的整數倍。
空類的計算
先說答案:空類的大小是1
c++的類有六個預設成員函式:
我們常用的是前四個。
1)建構函式:
成員變數為私有的,要對它們進行初始化,必須用乙個公有成員函式來進行。同時這個函式應該有且僅在定義物件時自動執行一次,這時呼叫的函式稱為建構函式(constructor) 。
建構函式是特殊的成員函式,其特徵如圖:
建構函式基本我們都使用全預設的過載函式。
2)拷貝建構函式:
建立物件時使用同類物件來進行初始化,這時所用的建構函式稱為拷貝建構函式(copy constructor),拷貝建構函式是特殊的建構函式。
來個例子:
特徵:class book
;int main( )
☛拷貝建構函式其實是乙個建構函式的過載。
☛拷貝建構函式的引數必須使用引用傳參,使用傳值方式會引發無窮遞迴呼叫。(思考為什麼?)
☛若未顯示定義,系統會預設預設的拷貝建構函式。預設的拷貝建構函式會,依次拷貝類成員進行初始化。
一般情況下我們會使用系統預設的拷貝建構函式,但是在特殊情況下需要顯示定義(比如鍊錶的拷貝構造)
3)析構函式
當乙個物件的生命週期結束時,c++編譯系統會自動呼叫乙個成員函式,這個特殊的成員函式即析構函式(destructor)
建構函式是特殊的成員函式,其特徵如下:
☛析構函式在類名加上字元~。
☛析構函式無引數無返回值。
☛乙個類有且只有乙個析構函式。若未顯示定義,系統會自動生成預設的析構函式。
☛物件生命週期結束時,c++編譯系統系統自動呼叫析構函式。
☛注意析構函式體內並不是刪除物件,而是做一些清理工作。(怎麼理解這裡的清理工作?參看下面的**)
class date
private :
int _year ;
int _month ;
int _day ;
};
4)賦值操作符過載為了增強程式的可讀性,c++支援運算子過載。class array
// 這裡的析構函式需要完成清(shi)理(fang)工(kong)作(jian)。
~ array ()
}private :
int* _ptr ;
};
運算子過載特徵:
☛operator+ 合法的運算子 構成函式名(過載《運算子的函式名:operator< )。
☛過載運算子以後,不能改變運算子的優先順序/結合性/運算元個數。
5個c++不能過載的運算子: .*/::/sizeof/?:/.
5)取位址操作符過載
6)const修飾的取位址操作符函式在成員函式後面加const,const修飾this指標所指向的物件,也就是保證呼叫這個const成員函式的物件在函式內不會被改變。class date
const date * operator&() const
private :
int _year ; // 年
int _month ; // 月
int _day ; // 日
};
class date
{public :
void display ()
{cout<
詳細例題會在後面博文中專門解釋。
c 類的預設成員函式
類的組成包括資料成員與成員函式。在類中一共有有六個預設成員函式,建構函式 拷貝建構函式 析構函式 賦值操作符過載 取位址操作符過載 const修飾的取位址操作符過載 利用乙個例項 日期類 進行舉例 先是定義乙個日期類 class date 這就是乙個簡單的類定義。下面依次介紹各個預設成員函式 一.建...
C 預設成員函式和this指標
類的六個預設成員函式 在學習這些預設的成員函式之前,務必先來了解一下this指標,因為除了建構函式外其他的預設成員函式都有乙個隱式的形參 this指標。這對於我們之後在預設成員函式的學習和使用方面有著很大的影響。this指標 1 每個成員函式都有乙個指標形參,他的名字是固定的,稱為this指標,th...
C 類的預設成員函式
class test 這些函式只有在需要的時候才會產生,空類占用 個位元組。類為了保護資料成員,其所有資料成員都預設是私有的 private 這也就意味著程式只能通過類裡面的函式提供介面來訪問資料成員。例如,下面程式用日期類建立了乙個物件,並進行初始化 class date int main 為了解...