天天看點

類和對象——登堂入室1.進一步了解構造函數1.2初始化清單2.靜态成員3.C++11的成員聲明的時候進行指派4.友元5.内部類

文章目錄

  • 1.進一步了解構造函數
    • 1.1構造函數體指派
  • 1.2初始化清單
      • 1.2.1是什麼是初始化清單
      • 1.2.2需要注意的幾點
    • 1.3匿名對象
    • 1.4explicit 關鍵字
  • 2.靜态成員
    • 2.1什麼是靜态成員
    • 2.2靜态成員的特性
  • 3.C++11的成員聲明的時候進行指派
  • 4.友元
    • 4.1友元函數
      • 4.1.1友元函數是什麼
      • 4.1.2友元函數特性
      • 4.1.3友元函數的使用場景
    • 4.2友元類
      • 4.2.1什麼是友元類
      • 4.2.2友元類的特性
  • 5.内部類
    • 5.1什麼是内部類
    • 5.2内部類的特性

1.進一步了解構造函數

1.1構造函數體指派

在建立對象時,編譯器會通過調用構造函數,給對象中各個成員變量一個合适的初始值,如下圖代碼所示:

類和對象——登堂入室1.進一步了解構造函數1.2初始化清單2.靜态成員3.C++11的成員聲明的時候進行指派4.友元5.内部類

如上圖所示,盡管構造函數被調用後,對象中已經有了一個初始值,但是這不能稱為類對象成員的初始化。因為調用構造函數的時候就已經進行了對象成員的定義,構造函數體内的語句隻能将其稱之為賦初值。且初始化隻能初始化一次,而構造函數體内可以多次指派

類和對象——登堂入室1.進一步了解構造函數1.2初始化清單2.靜态成員3.C++11的成員聲明的時候進行指派4.友元5.内部類

1.2初始化清單

進一步了解對象的定義:

表面上看對象的定義,在使用的時候就完成了,但是對象成員的定義界定于初始化清單

1.2.1是什麼是初始化清單

初始化清單是一個以冒号開始,接着是一個以逗号分隔的資料成員清單,每個成員變量後面跟一個放在括号中的初始值或表達式

類和對象——登堂入室1.進一步了解構造函數1.2初始化清單2.靜态成員3.C++11的成員聲明的時候進行指派4.友元5.内部類

1.2.2需要注意的幾點

1.每個成員變量在初始化清單中隻能出現一次(隻能進行一次定義初始化)

2.類中包含以下成員,必須在初始化清單的位置進行初始化(即必須定義的時候進行初始化的成員變量,必須使用初始化清單):

引用成員變量

const成員變量

自定義成員變量(該類沒有預設的構造函數即無參的/編譯器預設的/預設的構造函數)

類和對象——登堂入室1.進一步了解構造函數1.2初始化清單2.靜态成員3.C++11的成員聲明的時候進行指派4.友元5.内部類

3.盡量使用初始化清單初始化

類和對象——登堂入室1.進一步了解構造函數1.2初始化清單2.靜态成員3.C++11的成員聲明的時候進行指派4.友元5.内部類

4.成員變量在類中聲明次序就是在其初始化清單中的初始化順序,與其在初始化清單中的先後次序無關

類和對象——登堂入室1.進一步了解構造函數1.2初始化清單2.靜态成員3.C++11的成員聲明的時候進行指派4.友元5.内部類

1.3匿名對象

在定義時,不需要寫對象的名字,聲明周期隻有一行,常用于測試

類和對象——登堂入室1.進一步了解構造函數1.2初始化清單2.靜态成員3.C++11的成員聲明的時候進行指派4.友元5.内部類

1.4explicit 關鍵字

構造函數不僅可以構造和初始化對象,對于單個參數的構造函數,還具有類型轉換的作用,用關鍵字explicit修飾的構造函數,将會禁止單參構造函數的隐式轉換

類和對象——登堂入室1.進一步了解構造函數1.2初始化清單2.靜态成員3.C++11的成員聲明的時候進行指派4.友元5.内部類

2.靜态成員

2.1什麼是靜态成員

聲明為static的類成員稱為類的靜态成員

用static修飾的成員變量,稱之為靜态成員變量;用static修飾的成員函數,稱之為靜态成員函數。

靜态的成員變量一定要在類外進行初始化

2.2靜态成員的特性

1.靜态成員為所有類對象所共享,不屬于某個具體的執行個體

2.靜态成員變量必須在類外定義,定義時不添加static關鍵字

3.類靜态成員即可用類名::靜态成員或者對象.靜态成員來通路

4.靜态成員函數沒有隐藏的this指針,不能通路任何非靜态成員

5.靜态成員和類的普通成員一樣,也有public,protected,private三種通路級别,也可以具有傳回值

接下來我用一個例子來解析下靜态成員的特性:實作一個類,計算程式中建立出了多少個對象

類和對象——登堂入室1.進一步了解構造函數1.2初始化清單2.靜态成員3.C++11的成員聲明的時候進行指派4.友元5.内部類

3.C++11的成員聲明的時候進行指派

C++11支援非靜态成員變量在聲明的同時進行初始化指派,需要注意的是,這裡不是初始化,而是給聲明的成員變量預設值

類和對象——登堂入室1.進一步了解構造函數1.2初始化清單2.靜态成員3.C++11的成員聲明的時候進行指派4.友元5.内部類

4.友元

友元分為:友元函數和友元類

友元提供了一種突破封裝的方式,有時候提供了便利。但是友元會增加耦合度,破壞了封裝,是以友元不宜多用

4.1友元函數

4.1.1友元函數是什麼

友元函數可以直接通路類的私有成員,它是定義在類外部的普通函數,不屬于任何類,但需要在類的内部聲明,聲明的時候需要加上friend關鍵字

4.1.2友元函數特性

a.友元函數可以通路類的私有和保護成員,但不是類的成員函數

b.友元函數不能用const修飾

c.友元函數可以在類定義的任何地方聲明,不受通路限定符限制

d.一個函數可以是多個類的友元函數

e.友元函數的調用與普通函數的調用和原理相同

4.1.3友元函數的使用場景

類和對象——登堂入室1.進一步了解構造函數1.2初始化清單2.靜态成員3.C++11的成員聲明的時候進行指派4.友元5.内部類

4.2友元類

4.2.1什麼是友元類

友元類和友元函數有點相似,假如有Time和Date兩個類,在Date類中聲明Time類為其友元函數;

那麼可以直接在Time類中直接通路Date類的私有成員變量,但是不可以在Date類中通路Time類的私有成員變量

類和對象——登堂入室1.進一步了解構造函數1.2初始化清單2.靜态成員3.C++11的成員聲明的時候進行指派4.友元5.内部類

4.2.2友元類的特性

1.友元類的所有成員函數都可以是另外一個類的友元函數,都可以通路另外一個類的非公有成員

2.友元關系是單向的,不具有交換性,上述中在Time類中可以通路Date類的私有成員,但是在Date類中不能通路Time的私有成員

3.友元關系不能傳遞,假如A是B的友元,B是C的友元不能說A是C的友元

5.内部類

5.1什麼是内部類

如果一個類定義在另外一個類的内部,這個内部的類就叫做内部類。

特别注意,内部類是一個獨立的類,它不屬于外部類,也不能通過外部類的對象去調用内部類。外部類對内部類沒有任何優越的通路權限,但是内部類是外部的友元類

類和對象——登堂入室1.進一步了解構造函數1.2初始化清單2.靜态成員3.C++11的成員聲明的時候進行指派4.友元5.内部類

5.2内部類的特性

1.内部類可以定義在外部類的所有成員變量

2.内部類可以直接通路外部類中的static成員、枚舉成員、不需要外部類的對象/類名

3.sizeof(外部類)=外部類,和内部類沒有任何關系

繼續閱讀