c 查缺補漏

2022-03-02 14:12:13 字數 4806 閱讀 9866

c++ 基本語法:

c++初始化引數列表:

c++預設建構函式:

c++ 複製建構函式:

三 複製控制

1 複製建構函式

1.1 幾個要點

(1) 複製建構函式

複製建構函式是一種特殊建構函式,只有1個形參,該形參(常用 const &修飾)是對該類型別的引用。

class peopel

;     當定義乙個新物件並用乙個同型別的物件對它進行初始化時,將顯式使用複製建構函式。

peopel a1; peopel a2 = a1;

當將該型別的物件傳遞給函式或函式返回該型別的物件時,將隱式使用複製建構函式。

peopel func(peopel b)

(2)析構函式

析構函式是建構函式的互補:當物件超出作用域或動態分配的物件被刪除時,將自動應用析構函式。

析構函式可用於釋放構造物件時或在物件的生命期中所獲取的資源。

不管類是否定義了自己的析構函式,編譯器都自動執行類中非 static 資料成員的析構函式。

(3) 複製控制

複製建構函式、賦值操作符和析構函式總稱為複製控制。編譯器自動實現這些操作,但類也可以定義自己的版本。

(4) 兩種初始化形式

c++ 支援兩種初始化形式:直接初始化和複製初始化。直接初始化將初始化式放在圓括號中,複製初始化使用 = 符號。

對於內建型別,例如int, double等,直接初始化和複製初始化沒有區別。

對於類型別:直接初始化直接呼叫與實參匹配的建構函式;複製初始化先使用指定建構函式建立乙個臨時物件,然後用複製建構函式將那個臨時物件複製到正在建立的物件。直接初始化比複製初始化更快。

(5)形參和返回值

當形參或返回值為類型別時,由該類的複製建構函式進行複製。 

(6)初始化容器元素

複製建構函式可用於初始化順序容器中的元素。例如:

vectorsvec(5);

編譯器首先使用 string 預設建構函式建立乙個臨時值,然後使用複製建構函式將臨時值複製到 svec 的每個元素。 

(7)建構函式與陣列元素

如果沒有為類型別陣列提供元素初始化式,則將用預設建構函式初始化每個元素。

如果使用常規的花括號括住的陣列初始化列表來提供顯式元素初始化式,則使用複製初始化來初始化每個元素。根據指定值建立適當型別的元素,然後用複製建構函式將該值複製到相應元素:

sales_item primer_eds = ;

1.2 合成的複製建構函式

(1)合成的複製建構函式

如果沒有定義複製建構函式,編譯器就會為我們合成乙個。

合成複製建構函式的行為是,執行逐個成員初始化,將新物件初始化為原物件的副本。

逐個成員初始化:合成複製建構函式直接複製內建型別成員的值,類型別成員使用該類的複製建構函式進行複製。

例外:如果乙個類具有陣列成員,則合成複製建構函式將複製陣列。複製陣列時合成複製建構函式將複製陣列的每乙個元素。

1.3 定義自己的複製建構函式

(1) 只包含類型別成員或內建型別(但不是指標型別)成員的類,無須顯式地定義複製建構函式,也可以複製。 

class peopel

;(2) 有些類必須對複製物件時發生的事情加以控制。

例如,類有乙個資料成員是指標,或者有成員表示在建構函式中分配的其他資源。而另一些類在建立新物件時必須做一些特定工作。這兩種情況下,都必須定義自己的複製建構函式。

最好顯式或隱式定義預設建構函式和複製建構函式。如果定義了複製建構函式,必須定義預設建構函式。

1.4 禁止複製

有些類需要完全禁止複製。例如,iostream 類就不允許複製。延伸:容器內元素不能為iostream 

為了防止複製,類必須顯式宣告其複製建構函式為 private。

2 賦值操作符

與複製建構函式一樣,如果類沒有定義自己的賦值操作符,則編譯器會合成乙個。

(1)過載賦值操作符

sales_item&operator=(const sales_item &);

(2)合成賦值操作符

合成賦值操作符會逐個成員賦值:右運算元物件的每個成員賦值給左運算元物件的對應成員。除陣列之外,每個成員用所屬型別的常規方式進行賦值。對於陣列,給每個陣列元素賦值。

(3)複製和賦值常一起使用

一般而言,如果類需要複製建構函式,它也會需要賦值操作符。 

四 友元

友元機制允許乙個類將對其非公有成員的訪問權授予指定的函式

友元可以出現在類定義的內部的任何地方。

友元不是授予友元關係的那個類的成員,所以它們不受宣告出現部分的訪問控制影響。

建議:將友元宣告成組地放在類定義的開始或結尾

1 友元類

class husband

;class wife

};husband h;

wife w;

w.consume(h);

2 使其他類的成員函式成為友元

class husband; //1.宣告husband 

class wife //2.定義wife類 

;class husband //3.定義husband類

;void wife::consume(husband& h) //4.定義consume函式。

注意類和函式的宣告和定義的順序:

(1)宣告類husband 

(2)定義類wife,宣告consume函式

(3)定義類husband

(4)定義consume函式。

五 static 類成員

static 成員,有全域性物件的作用,但又不破壞封裝。

1 static 成員變數

static 資料成員是與類關聯的物件,並不與該類的物件相關聯。

static 成員遵循正常的公有/私有訪問規則。  

2 使用 static 成員而不是全域性物件有三個優點。

(1)  static 成員的名字是在類的作用域中,因此可以避免與其他類的成員或全域性物件名字衝突。

(2)  可以實施封裝。static 成員可以是私有成員,而全域性物件不可以。

(3)  通過閱讀程式容易看出 static 成員是與特定類關聯的,這種可見性可清晰地顯示程式設計師的意圖。 

3 static 成員函式

在類的內部宣告函式時需要新增static關鍵字,但是在類外部定義函式時就不需要了。

因為static 成員是類的組成部分但不是任何物件的組成部分,所以有以下幾個特點:

1) static 函式沒有 this 指標

2) static 成員函式不能被宣告為 const (將成員函式宣告為 const 就是承諾不會修改該函式所屬的物件)

3) static 成員函式也不能被宣告為虛函式

4 static 資料成員

static 資料成員可以宣告為任意型別,可以是常量、引用、陣列、類型別,等等。

static 資料成員必須在類定義體的外部定義(正好一次),並且應該在定義時進行初始化。

建議:定義在類的原始檔中名,即與類的非內聯函式的定義同乙個檔案中。注意,定義時也要帶上類型別+"::"

double account::interestrate = 0.035; 

5 特殊的靜態常量整型成員

靜態常量整型資料成員可以直接在類的定義體中進行初始化,例如:

static const int period = 30; 

當然char 可以轉換成整形,也是可以的,   static const char bkground = '#';

6 其他

(1)static 資料成員的型別可以是該成員所屬的類型別。非 static 成員只能是自身類物件的指標或引用 

class screen 

; (2)非 static 資料成員不能用作預設實參,static 資料成員可用作預設實參

class screen 

;

bootstrap 查缺補漏

bootstrap標題樣式進行了以下顯著的優化重置 單行內聯 多行塊 注pre.pre scrollable 控制 塊區域最大高度為340px,一旦超出這個高度,就會在y軸出現滾動條 使用者輸入 複製 table 基礎 table striped 斑馬線 table bordered 帶邊框的 ta...

React查缺補漏

1.react.createelement 根據指定的第乙個引數建立乙個react元素 第乙個引數是必填,傳入的是似html標籤名稱,eg ul,li 第二個引數是選填,表示的是屬性,eg classname 第三個引數是選填,子節點,eg 要顯示的文字內容 render react.createe...

HTML查缺補漏

標籤名必須使用小寫字母 屬性名必須使用小寫字母,屬性值必須用雙引號包裹 使用4個空格作為乙個縮排層級 class屬性值 單純全小寫,單詞之間以 分割 id屬性值使用小駝峰式命名法 元素是實體,標籤是名稱 標記 元素構成html檔案的基本物件 標籤用於標記html元素屬性 引入外部資源 定義內聯樣式 ...