C 類知識點總結

2021-08-21 09:46:17 字數 4074 閱讀 2890

c++類

1.   定義抽象資料型別

(1).成員函式的宣告必須在類的內部,它的定義既可以在類的內部也可以在類的外部。定義在類內部的函式是隱式的inline函式。

this:

(2).成員函式通過乙個名為this的額外的隱式引數來訪問呼叫他的那個物件。當我們呼叫乙個成員函式時,用請求該函式的物件位址來初始化this。

//偽**,用於說明呼叫成員函式的實際執行過程

sales_data::isbn(&total);

(3).在成員函式內部,我們可以直接使用呼叫該函式的物件的成員,而無需通過成員訪問運算子來做到這一點,因為this所指的正是這個物件。任何對類成員的直接訪問都被看做this的隱式引用。

(4).對於我們來說,this形參是隱式定義的。實際上,任何自定義為this的引數或變數的行為都是非法的。此外,this是乙個常量指標,我們不被允許改變this中儲存的位址。

(5).const 成員函式:

預設情況下,this的型別是指向類型別為非常量版本的常量指標。儘管this是隱式的,但它仍然遵循初始化規則,即我們不能把this繫結到乙個常量的物件上。這一情況也就使得我們不能在乙個常量物件上呼叫普通的成員函式。

緊跟在引數列表後面的const表示this是乙個指向常量的指標,像這樣使用const的成員函式被稱為常量成員函式

(6).類作用域和成員函式:

編譯器分兩步處理類:首先編譯成員的宣告,然後才輪到成員函式體。因此成員函式可以隨意使用類中的其他成員而無須在意這些成員出現的次序。

(7).建構函式

[1].在c++11新標準中,如果我們需要預設的行為,那麼可以通過在引數列表後面寫上= default來要求編譯器生成建構函式。

sales_data()= default;

[2].建構函式初始值列表:它負責為新建立的物件的乙個或幾個資料成員賦初值。

sales_data(conststring& s) : bookno(s), units_sold(0), revenue(0){}

[3].函式體中賦值:如果沒有在建構函式的初始值列表中顯式的初始化成員,則該成員將在建構函式體之前執行預設初始化。

例如://sales_data建構函式的一種寫法,雖然合法但比較草率,沒有使用建構函式初始值。

sales_data::sales_data(conststring &s, unsigned cnt, double price)

}

[8].使用預設實參的建構函式

class sales_data

如果給乙個建構函式的所有形參都提供了預設實參,那麼它實際上也定義了預設建構函式。

[9].在實際中,如果定義了其他建構函式,那麼最好定義乙個建構函式。

[10].使用預設建構函式:sales_data obj();  //正確,宣告了乙個返回值為sales_data的函式。

[11].隱式的類型別轉換

如果建構函式只接受乙個引數,則它實際上定義了轉換為此類型別的隱式轉換機制,有時我們把這種建構函式成為轉換建構函式。

只允許一步型別轉換:

例如成員函式:sales_data&combine(cosnt sales_data&);

轉換建構函式有:sales_data(const string&);

sales_data(istream&);

item.combine(「9-9999-9999」);//錯誤,需要使用者定義的兩種轉換

item.combine(string(「9-9999-9999」));//正確,顯示轉換為string,隱式地轉換為sales_data

item.combine(sales_data(「9-9999-9999」));//正確,隱式地轉換成string,顯式地轉換成sales_data

(8).拷貝、賦值和析構

如果我們不主動定義這些操作,則編譯器將替我們合成它們。一般來說,編譯器生成的版本將對對向的每個成員執行拷貝、賦值和銷毀操作。

例如乙個類有bookno(string)、units_sold(unsigned)、revenue(double)資料成員,當編譯器執行如下賦值語句時,total = trans;  //處理下一本書的資訊

它的行為將和下面的**相同

//sales_data的預設賦值操作等價於

total.bookno = trans.bookno;

total.units_sold = trans.units_sold;

total.revenue = trans.revenue;

但需要注意的是,對於某些類來說合成的版本無法進行正常工作。特別是,當類需要分配物件之外的資源時,合成的版本常常會失效。

2.   訪問控制與封裝

private, public和友元

[1]使用class和struct定義類的唯一區別就是預設的訪問許可權。

[2]friend,類可以允許其他類或者函式訪問它的非公有成員,方法是令其他類或者函式成為它的友元。友元宣告只能出現在類定義的內部,但是在類內出現的具體位置不限。友元不是類的成員也不受他所在區域訪問控制級別的約束。友元類可以訪問此類包括非公有成員在內的所有成員。

[3]友元的宣告的意義:友元的宣告僅僅指定了訪問的許可權,而非乙個通常意義上的函式宣告。如果我們希望類的使用者能夠呼叫某個友元函式,那麼我們就必須在友元宣告之外再專門對函式進行一次宣告。

[4].每個類負責控制自己的友元類或友元函式,友元關係不存在傳遞性。

3. 類的其他特性

(1).定義乙個型別成員

除了定義資料和函式成員之外,類還可以自定義某種型別在類中的別名。由類定義的型別名字和其他成員一樣存在訪問控制。

class screen{

public:

typedef std::string::size_type pos; //也可以使用型別別名

private:

pos cursor = 0;

pos height = 0, width = 0;

std::string contents;

*用來定義型別的成員必須先定義後使用,這一點和普通成員有所區別。

(2).返回*this的成員函式

[1].返回引用的函式是左值的,意味著這些函式返回的是物件本身而非物件的副本。

[2].乙個const成員函式如果以引用的形式返回*this,那麼它的返回型別將是常量引用。

(3).類的作用域

類的定義分兩步處理:a.首先編譯成員的宣告;b.直到類全部可見後才編譯函式體。

3.   類的靜態成員

[1].我們通過在成員前加static使得其與類關聯在一起,和其他類型別一樣,靜態成員可以是public 或public 的。

[2].靜態成員函式也不與任何物件繫結在一起,它們不包含this指標,靜態成員函式不能宣告為const的,而且我們也不能在static函式體內使用this指標。這一限制既適用於this的顯式使用,也對呼叫非靜態成員的隱式使用有效。

c 知識點總結

1 c 中判斷物件為空的幾種方式 1 先了解幾個與空型別相關的關鍵字和物件 null 關鍵字表示不引用任何物件的空引用,它是所有引用型別變數的預設值,在2.0版本之前也就只有引用變數型別可以為null,如 string a null 但在c 2.0版本之後,net也引入了可以為null的值型別,但變...

C 知識點總結

程式 資料結構 演算法.c語言是面向過程的,面向過程就是分析出解決問題的步驟,然後用函式將其實現,使用時依次呼叫.程式 物件 訊息.c 是物件導向的,c 物件導向是將構成問題的事物分解成各個物件,每個物件完成在解決整個問題中的行為.主要特點是類,封裝,繼承,多型等。物件導向的語言具有更好的可擴充套件...

C 知識點總結

變數和常量 命名變數 在c 中,使用變數的基本原則是先定義後使用。其命名規範如下 1.必須以字母或下劃線開頭 2.只能由字母 數字 下劃線組成,不能 包含空格 標點符號 運算子及其他符號 3.不能與c 關鍵字同名,如class,new等 例如,正確命名 int i 整型變數 stringuser n...