C 類和物件

2021-08-19 13:48:04 字數 2994 閱讀 5047

1.c++語言的的作用域:

區域性作用域;

全域性作用域;

類作用域;

2.在《c++primer》中是這樣解釋類的:

類型別通常被稱為抽象資料型別(abstract data type)。抽象資料型別將資料(即狀態)和作用於狀態的操作視為乙個單元,我們可以抽象地考慮類該做什麼,而無需知道類如何完成這些操作。

抽象資料型別是物件導向程式設計和泛型程式設計的基礎。

3.物件導向語言的四大特徵

:抽象  封裝/隱藏  繼承  多型

物件導向語言的三大特徵

:封裝/隱藏  繼承 多型

4.定義乙個類:

(1)簡言之,類就是定義了乙個新的型別和新的作用域

(2)建立類的目的,是用來抽象實體的型別,從實體的屬性和行為兩方面,得到類的成員變數和成員方法,因為類是實體型別的抽象,所以類型別不佔空間。

(3)每個類可以沒有成員,也可以定義多個成員,成員可以是資料,函式或型別別名。

(4)乙個類可以包含若干個public(公有的),private(私有的),protected(受保護的)部分/

(5)用struct和class都可以定義類,但是,在沒有訪問限定符的情況下,class定義的類預設都是private訪問限定,struct都是public訪問限定。

(6)對於類成員方法的定義,可以在類內定義,也可以在類外定義,但是要注意的是,如果在類外定義,需要在函式名之前加上類作用域。如果成員方法在類體內定義,就自動處理為inline函式了。

普通成員變數和成員方法需要依賴物件才可以呼叫。

5.建構函式和析構函式:

(1)建構函式:建構函式是乙個特殊的、與類名相同的成員函式,主要用於對物件記憶體進行初始化

(2)析構函式:析構函式是類名前加~的成員函式,主要作用是物件記憶體釋放前,把占用的其它系統資源釋放掉。

值得注意

:物件的記憶體是由系統開闢的,建構函式只是做了記憶體的初始化,構造函式呼叫完了,我們就可以理解為物件產生了。所以

建構函式不是給物件開闢記憶體的

。同理,析構函式是在物件記憶體釋放之前,將物件占用的外部資源先釋放掉(例如釋放堆上占用的記憶體)。所以

析構函式也不是釋放物件記憶體的。

(3)建構函式和析構函式沒有返回值。

(4)建構函式可以帶引數,所以建構函式是可以過載的。析構函式不能帶有引數,所以析構函式只能有乙個。

(5)當類中沒有任何構造/析構函式的時候,編譯器會給當前類乙個預設的構造/析構函式。(是乙個空函式,什麼都不做)

(6)如果類中定義了任意建構函式,就不會產生預設建構函式了。

(7)在定義預設構造的物件,不要在構造時在物件名字後面加()。

(8)先構造的函式是後析構的,後構造的函式是先析構的。

6.乙個簡單的類

#include#includeusing namespace std;

class cperson//類名

cperson(int ag,char *na,char *add)

void show();

~cperson(){}

private://私有的

int age;

char name[20];

char address[20];

};void cperson::show()// 在類外定義函式需要註明作用域

int main()

7.成員函式被const修飾:

將關鍵字const加在形參之後,就可以將成員函式宣告為常量。const成員不能改變其操作的物件的資料成員。const必須同時出現在宣告和定義中,若只出現一處,就會出現編譯時的錯誤。

若提供返回名字和位址的操作,函式應該為const的,這樣提高了方法的安全性,防止被修改。

8.this指標

乙個類可以產生多個成員物件,每個物件都有自己的乙份成員變數,它們共享這個成員的成員方法。那麼問題來了,即然類的方法是由多個物件共享的,那麼成員方法在被呼叫的時候是怎麼知道是哪個物件呼叫的呢?

這個時候就引入this指標的概念了,成員函式具有乙個附加的隱含形參,即指向該類物件的乙個指標。這個隱含形參命名為this。

類的成員方法一經編譯,形參都會加上當前類型別的this指標變數。

在物件呼叫成員方法====》把物件的位址作為方法的實參進行傳遞。

在方法裡面訪問其他成員,都是通過this->來呼叫的。

9.淺拷貝和深拷貝

淺拷貝:簡單來說,淺拷貝可以理解為直接將值複製給將要拷貝的物件。若其中有變數指向外部資源,那麼也只是會直接指向同一塊外部資源。

深拷貝:可以理解為,若乙個類擁有外部資源,且當這個類的物件發生拷貝的時候,會為新物件分配新的資源。

>預防淺拷貝問題的方法:

1)自定義拷貝建構函式和賦值運算子過載函式

2)將這兩個函式私有化,從根本上杜絕淺拷貝的問題

class a

private:

int _x;

int & _y;

const int _z;

};

10.拷貝建構函式

場景:同型別乙個已經存在的物件構造新物件的時候,就會呼叫拷貝建構函式。

結論:當類中沒有提供拷貝建構函式時,編譯器就會產生乙個預設的拷貝建構函式,做記憶體拷貝(淺拷貝)。

帶來的問題:若類中有成員指向外部資源的時候,若沒有自定義拷貝建構函式,那麼會做記憶體拷貝。當被拷貝構造的物件析構時,直接就釋放了指向的外部資源,原物件再次析構就會出現問題,因為他所指向的外部資源已經被釋放掉了,釋放兩次勢必是會出錯的。所以,當物件淺拷貝出錯,一定要提供自定義的拷貝建構函式。

class a

private:

int _x;

int & _y;//引用必須在定義的時候初始化,並且不能重新賦值,所以必須在初始化列表中初始化

const int _z;//常量成員只能初始化不能賦值,所以必須在初始化列表中初始化

};

需要注意:成員的初始化順序是在類中定義出現的順序初始化的,而不是按照初始化列表的順序初始化的。

C 類和物件 類和物件

c 中物件的型別稱為類,類代表了某一批物件的共性和特徵,類是物件的抽象,而物件是類的具體例項,類是抽象的,不占用記憶體,而物件是具體的,占用 儲存空間,這點很重要,讀者需要牢記。類是使用者自己指定的型別,如果程式中要用到類型別,必須自己根據需要進行宣告,或者使用別人已設計好的類,c 標準本身並不提供...

C 物件和類

1,特殊的類 字串string include include using namespace std int main 類似於標準庫函式,我們不需要記住每種 類 的全部操作,只需要在使用過程中記住一些常用的操作就可以了。如果有需要的話,可以求助於相關書籍或網路 2,當我們對string進行種種操作...

C (類和物件)

類成員函式 類的成員函式指標那些把定義和原型寫在類定義內部的函式,就想類定義中的其他變數一樣。類訪問修飾符 類成員可以定義為public,private或protected。預設情況下是定義為private。建構函式 類的建構函式是一種特殊的函式,在建立乙個新物件是呼叫。析構函式 類的析構函式也是一...