名稱空間
變體
操作

來自 cppreference.com
< cpp‎ | 語言
 
 
C++ 語言
 
 

類是使用者定義型別。

類型別由類說明符定義,其出現在宣告語法的 decl-specifier-seq 中。參閱類宣告以瞭解類說明符的語法。

類可以有以下種類的成員

1) 資料成員
2) 成員函式
3) 巢狀型別
a) 類定義中定義的巢狀類列舉
b) 現有型別的別名,透過 typedef 類型別名(C++11 起)宣告定義
c) 類自身定義中的類名,在查詢時作為其自身的公有成員類型別名(除了用於命名建構函式時):這被稱為注入類名
4) 類中定義的所有無作用域列舉的列舉器,或透過using-宣告using-enum-宣告引入的列舉器(C++20 起)
5) 成員模板變數模板、(C++14 起)類模板或函式模板)可以出現在任何非區域性類/結構體/聯合體的體中。

所有成員都在類定義中一次性定義,不能新增到已定義的類中(與名稱空間成員不同)。

如果類 T 的成員是以下之一,則不能使用 T 作為其名稱:

  • 靜態資料成員,
  • 成員函式,
  • 成員型別,
  • 成員模板,
  • 列舉的列舉器(除非列舉有作用域)(C++11 起),或
  • 成員匿名聯合的成員。

然而,只要沒有使用者宣告的建構函式,非靜態資料成員可以使用名稱 T

一個至少有一個宣告或繼承的成員函式的類是多型的。此型別的物件是多型物件,並在物件表示中儲存執行時型別資訊,可以使用 dynamic_casttypeid 查詢。虛成員函式參與動態繫結。

一個至少有一個宣告或繼承的純虛成員函式的類是抽象類。此型別的物件不能被建立。

具有 constexpr 建構函式的類是字面型別:此型別的物件可以在編譯時由 constexpr 函式操縱。

(C++11 起)

目錄

[編輯] 類的屬性

平凡可複製類

一個平凡可複製類是指:

平凡類

一個平凡類是指:

(C++26 中已棄用)

標準佈局類

一個標準佈局類是指:

  • 沒有非標準佈局類型別(或此類型別的陣列)或引用型別的非靜態資料成員
  • 沒有虛擬函式且沒有虛基類
  • 所有非靜態資料成員具有相同的訪問控制
  • 沒有非標準佈局基類,
  • 繼承層次中只有一個類擁有非靜態資料成員,以及
  • 非正式地說,沒有基類與第一個非靜態資料成員的型別相同。或,正式地說:給定類 S,其沒有型別集合 M(S) 中的任何元素作為基類,其中型別 X 的 M(X) 定義如下:
  • 如果 X 是一個沒有(可能繼承的)非靜態資料成員的非聯合類型別,則集合 M(X) 為空。
  • 如果 X 是一個非聯合類型別,其第一個非靜態資料成員的型別為 X0(其中所述成員可能是匿名聯合),則集合 M(X) 由 X0 和 M(X0) 的元素組成。
  • 如果 X 是一個聯合型別,則集合 M(X) 是所有 M(Ui) 和包含所有 Ui 的集合的並集,其中每個 Ui 是 X 的第 i 個非靜態資料成員的型別。
  • 如果 X 是一個元素型別為 Xe 的陣列型別,則集合 M(X) 由 Xe 和 M(Xe) 的元素組成。
  • 如果 X 是非類、非陣列型別,則集合 M(X) 為空。

標準佈局結構體是使用類關鍵詞 struct 或類關鍵詞 class 定義的標準佈局類。標準佈局聯合體是使用類關鍵詞 union 定義的標準佈局類。

(C++11 起)

[編輯] 隱式生命週期類

一個隱式生命週期類是指:

  • 是一個聚合體,其解構函式不是使用者宣告的(C++11 前)使用者提供的(C++11 起),或
  • 至少有一個平凡的合格建構函式和一個平凡的、非刪除的解構函式。

注:缺陷報告 P0593R6 澄清了隱式生命週期屬性。

[編輯] POD 類

一個POD 類是指:

  • 是一個聚合體
  • 沒有使用者宣告的複製賦值運算子,
  • 沒有使用者宣告的解構函式,以及
  • 沒有非POD類型別(或此類型別的陣列)或引用型別的非靜態資料成員。
(C++11 前)
  • 是一個平凡類,
  • 是一個標準佈局類,以及
  • 沒有非POD類型別(或此類型別的陣列)的非靜態資料成員。
(C++11 起)

POD 結構體是非聯合 POD 類。POD 聯合體是作為 POD 類的聯合體。

(C++20 中已棄用)

[編輯] 缺陷報告

下列更改行為的缺陷報告追溯地應用於以前出版的 C++ 標準。

缺陷報告 應用於 釋出時的行為 正確的行為
CWG 148 C++98 POD 類不能包含指向成員的指標,
它們本身就是 POD(標量)型別
限制已移除
CWG 383 C++98 POD 類中可以使用者聲明覆制賦值運算子或解構函式,如果它們未定義。
若未定義,則在 POD 類中
不允許
CWG 1363 C++11 一個同時擁有平凡預設建構函式和非平凡
預設建構函式的類可能是平凡的
它不是平凡的
CWG 1496 C++11 一個只擁有建構函式且所有建構函式
都定義為已刪除的類可能是平凡的
它不是平凡的
CWG 1672 C++11 一個類可能是標準佈局類
如果它有多個空基類
它不是標準佈局類
CWG 1734 C++11 平凡可複製類不能有非平凡的
已刪除的複製/移動建構函式/賦值運算子
如果已刪除,可以是平凡的
CWG 1813 C++11 一個類如果有一個基類繼承了非靜態資料成員,則它從不是標準佈局類。
基類繼承非靜態資料成員
它可以是標準佈局類
CWG 1881 C++11 對於標準佈局類及其基類,
未命名的位域可能在
宣告資料成員的不同類中宣告
所有非靜態資料成員
和位域需要首先
在同一個類中宣告
CWG 1909 C++98 成員模板可以與其類同名 已禁止
CWG 2120 C++11 在確定標準佈局類時,M(X) 的定義沒有考慮
沒有考慮其第一個成員是陣列的
一個類的情況
在 M(X) 的定義中
解決了這種情況
CWG 2605 C++98 隱式生命週期類可以擁有使用者提供的解構函式 已禁止