類和物件(上)

2021-08-21 14:50:43 字數 2568 閱讀 3497

1.什麼是物件導向?

想想之前學過的c語言,c語言是面向過程的語言,不管是簡單型別還是複雜型別,只是一味的呼叫函式,這裡的呼叫函式就是將資料處理的過程,更加在乎的是處理邏輯和處理結果

c++是面向過程的語言,首先要說一下什麼是類?什麼是物件?

類,通俗的就講就是乙個事物的描述,描述著這一類事物的特徵和動作,即成員變數和成員函式

物件,是類例項化出來的,這樣講可能太過於生硬,如果把模擬作一棟大樓的圖紙,那麼物件就是根據這張圖紙建造出來的大樓

那麼面相物件程式設計就是,用乙個類例項化出物件,然後物件執行他所擁有的動作,此外,c++還有三個重要的特點:

2.類的大小?為什麼要記憶體對齊?記憶體對齊的計算?空類的計算

乙個類中既有成員變數,又有成員函式,計算乙個類的時候只看成員變數的大小,具體計算方法是根據記憶體對齊原則,如果乙個類中沒有成員變數,那麼這個類的大小為乙個位元組,這乙個位元組是用來佔位的,假設沒有成員變數的類的大小是0,那麼這個類就不能例項化物件,也就沒辦法呼叫類中的方法 ,成員函式並不參與類大小的計算,這些成員函式放在乙個公共的位置,每個例項化的物件都能看見,在需要的時候呼叫就好,這是一種節省空間的方法,假如給每個物件裡面都把成員函式放進去,那麼這個物件就會很大,而且變大完全沒有意義,並且浪費記憶體。

記憶體對齊是為了提高程式效率的一種以空間換時間的方法,雖然浪費了記憶體,但是提高了效率,這跟位址匯流排有關,假設乙個臺器,一次在記憶體上可以取四個位元組,取多了會將對於的丟棄,取少了會繼續取,有這麼乙個類:

class a

private:

int _id;

int _age;

};//建立物件是就可以  people p1(1001, 21);析構函式

在建構函式名前加乙個波浪線(~)就叫做析構函式,這個函式在物件銷毀時呼叫,完成一些清理工作,**如下:

#includeclass people 

~people()

private:

int _id;

int _age;

};int main()

system("pause");

return 0;

}

在vs下,要使用 system("pause"); 使「黑框框」停下,所以要觀察析構函式,就在物件外面包裹一對{},如果不加大括號,主函式沒出就不會呼叫析構函式,但是想要呼叫,就必須走過 system("pause");,但是過了這一句,「黑框框」就會消失。

拷貝建構函式

拷貝構造也是乙個建構函式,引數就是這個類的乙個物件的引用,如果不在類中寫拷貝構造,那麼系統會自動生成乙個預設拷貝建構函式,將作為引數的這個物件的內容乙個位元組乙個位元組的拷貝到呼叫拷貝構造的物件之中,如果在類中寫了拷貝構造,那麼系統就不會自動生成,而是執行類中的拷貝建構函式,

深拷貝和淺拷貝

規定乙個場景,在乙個類中,有乙個char型的指標,構造了乙個物件a1, 這個物件中的指標指向了一塊堆上開闢用來存放字串的記憶體,如果使用系統預設的拷貝建構函式建立乙個a2,這個預設的拷貝建構函式只會將a1物件中的指標的值複製給了a2物件中的指標,讓a2中的指標指向了同一塊記憶體,這個叫做淺拷貝

如果我們自己寫了乙個拷貝建構函式,這個拷貝建構函式會讓a2中的指標指向新開闢的一塊堆上的記憶體,並且這塊記憶體中的內容是從a1指向的記憶體中複製而來,這個叫做深拷貝

原理圖如下:

賦值操作符過載

再說複製函式之前要說一下運算子過載,操作符過載是針對使用者自定義型別,可以理解為類型別,為了使自定義型別能夠像內建型別一樣使用操作符,c++的設計者創造了操作符過載,但是有五個操作符不能過載:.*/::/sizeof/?:/.  

運算子過載特徵:

1. operator+合法的運算子構成函式名(過載《運算子的函式名:operator

2. 過載運算子以後,不能改變運算子的優先順序/結合性/運算元個

對賦值操作符過載

#includeclass people 

people& operator= (const people& p)

return *this;

}private:

int _id;

int _age;

};int main()

這裡有乙個問題,賦值操作符的過載函式一定要返回乙個引用嗎?

必須返回!我們都只到,內建型別支援像p5一樣的連續賦值,如果不返回*this的引用,p5的賦值就會報錯

在這裡簡單的解釋一下this指標

這是在物件呼叫成員函式時隱藏的乙個指標,這個指標指向呼叫該成員函式的物件,以上面的people類為例,在p1呼叫建構函式時,看起來是這樣的

實際上編譯器把這二個過程解釋為了

但是這個this不能顯式的寫出來,但是確實存在,搶占了左邊第乙個引數,並且可以使用。

類和物件(上)

類的定義格式 說明部分和實現部分 class 類名 public 公有資料成員和成員函式 protected 保護資料成員和成員函式 private 私有資料成員和成員函式 各個成員函式的實現 建構函式 a 作用 為物件分配空間 對物件初始化 即賦初始值 請求其他資源。b 特點 函式名和類名完全相同...

類和物件(上)

1.類是物件的抽象,而物件是類的具體例項。類是抽象的,不占用記憶體 而物件是具體的,占用儲存空間。2.面向過程與物件導向 c語言是面向過程的,關注的是過程中的資料與方法。c 是物件導向的,關注的是物件 的屬性與功能。1.在c 中,結構體內不僅可以定義變數,也可以定義函式。struct student...

類和物件(上)

類是物件的抽象,而物件是類的具體例項。類是抽象的,不占用記憶體 而物件是具體的,占用記憶體空間。c語言是面向過程的,關注的是過程中的資料與方法。c 是物件導向的,關注的是物件的屬性與功能。1.類的簡單定義 class為定義類的關鍵字,date為類的名字,中為類的主體,注意類定義結束時後面分號。類中的...