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.乙個簡單的類
7.成員函式被const修飾:#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()
將關鍵字const加在形參之後,就可以將成員函式宣告為常量。const成員不能改變其操作的物件的資料成員。const必須同時出現在宣告和定義中,若只出現一處,就會出現編譯時的錯誤。
若提供返回名字和位址的操作,函式應該為const的,這樣提高了方法的安全性,防止被修改。
8.this指標
乙個類可以產生多個成員物件,每個物件都有自己的乙份成員變數,它們共享這個成員的成員方法。那麼問題來了,即然類的方法是由多個物件共享的,那麼成員方法在被呼叫的時候是怎麼知道是哪個物件呼叫的呢?
這個時候就引入this指標的概念了,成員函式具有乙個附加的隱含形參,即指向該類物件的乙個指標。這個隱含形參命名為this。
類的成員方法一經編譯,形參都會加上當前類型別的this指標變數。
在物件呼叫成員方法====》把物件的位址作為方法的實參進行傳遞。
在方法裡面訪問其他成員,都是通過this->來呼叫的。
9.淺拷貝和深拷貝
淺拷貝:簡單來說,淺拷貝可以理解為直接將值複製給將要拷貝的物件。若其中有變數指向外部資源,那麼也只是會直接指向同一塊外部資源。
深拷貝:可以理解為,若乙個類擁有外部資源,且當這個類的物件發生拷貝的時候,會為新物件分配新的資源。
>預防淺拷貝問題的方法:
1)自定義拷貝建構函式和賦值運算子過載函式
2)將這兩個函式私有化,從根本上杜絕淺拷貝的問題
10.拷貝建構函式class a
private:
int _x;
int & _y;
const int _z;
};
場景:同型別乙個已經存在的物件構造新物件的時候,就會呼叫拷貝建構函式。
結論:當類中沒有提供拷貝建構函式時,編譯器就會產生乙個預設的拷貝建構函式,做記憶體拷貝(淺拷貝)。
帶來的問題:若類中有成員指向外部資源的時候,若沒有自定義拷貝建構函式,那麼會做記憶體拷貝。當被拷貝構造的物件析構時,直接就釋放了指向的外部資源,原物件再次析構就會出現問題,因為他所指向的外部資源已經被釋放掉了,釋放兩次勢必是會出錯的。所以,當物件淺拷貝出錯,一定要提供自定義的拷貝建構函式。
需要注意:成員的初始化順序是在類中定義出現的順序初始化的,而不是按照初始化列表的順序初始化的。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。建構函式 類的建構函式是一種特殊的函式,在建立乙個新物件是呼叫。析構函式 類的析構函式也是一...