第三章 《類和物件II》

2021-10-17 03:32:56 字數 3179 閱讀 3441

目錄

1.什麼是常物件?使用常物件時要注意什麼?

2.什麼是常資料成員?常資料成員怎麼賦初值?

3.帶成員初始化列表的建構函式的執行順序是怎樣的?

4.在建構函式成員初始化列表中初始化資料成員和在建構函式體中初始化,結果是一樣的?二者在效能方面有什麼區別呢?

5.什麼是常成員函式?使用常成員函式要注意什麼?

6.mutable有什麼作用?

7.c++中的explicit的作用是什麼?

8.什麼是子物件?

9.子物件的建構函式的執行次序是什麼樣的?

10.子物件的析構函式的執行次序是什麼樣的?

11.什麼是靜態子物件?

12.什麼是前向引用宣告?

13.說明c++中區域性類和巢狀類的區別。

14.說明巢狀類的主要作用。

15.在軟體開發中有一種單例模式,即在應用中僅允許建立類的乙個例項。那麼如何採用c++實現單例模式?

常物件是指物件常量。定義格式:「類名 const 物件名;」或者「const 類名 物件名;」

使用常物件時要注意:

在定義常物件時必須進行初始化;

常物件的資料成員不能被更新;

如果乙個物件被定義為常物件,則不能呼叫該物件的非const成員函式,否則會報錯。這樣做是為了防止非const成員函式修改常物件中的資料元素值,因為const成員函式是不可以修改物件中的資料成員值的。

在類中使用const定義的資料成員是常資料成員。

常資料成員的賦初值只能通過建構函式,並且建構函式只能通過成員初始化列表來實現。

先執行初始化列表,再執行函式體,對於含有多個初始化項的列表不是按照從左到右或者右到左的順序執行,而是按照資料成員在類中定義的順序執行的。

參考:建構函式初始化的方法及區別

對於類的非const資料成員,可以在成員初始化列表中初始化,也可以在建構函式體中初始化,二者的結果是一樣的。

一般情況下,對於內建的資料型別(含指標和引用),在成員初始化列表和建構函式體內進行,在效能和結果上都是一樣的;

對於使用者自定義的類型別(即子物件的情況),在效能上存在很大差別,因為前者只用呼叫一次建構函式,後者除了呼叫一次預設的建構函式,還要呼叫賦值運算子才能完成。而函式呼叫時浪費資源的,所以在這種情況下採用成員初始化列表來初始化資料成員效能更優。

使用const關鍵字宣告的函式為常成員函式,宣告格式為「函式型別 函式名(參數列) const;

在使用常成員函式是要注意:

const是函式型別的乙個組成部分,因此在實現部分也要帶const關鍵字;

常成員函式不能更新物件的資料成員,也不能呼叫該類中的非常成員函式;

如果將乙個物件定義為常物件,則通過該常物件只能呼叫它的常成員函式,不能呼叫非const成員函式;

const關鍵字可以參與區分過載函式。如「void display();」和「void display() const;」是對display的有效過載。

在定義乙個常物件後只能呼叫const成員函式,而且const成員函式不能修改資料成員值。

如果希望通過常物件修改某些資料成員值,只需將其定義為mutable(易變的),mutable資料成員永遠不會是const成員,即使它是乙個const物件的資料成員。

const成員函式可以修改mutable資料成員的值,常物件通過呼叫該const成員函式即可修改該mutable資料成員的值。

c++中的explicit關鍵字(含義是明確的,不隱瞞的)只能用於修飾只有乙個引數的類建構函式,它的作用是表示該建構函式時顯式的,而非隱式的,從而阻止不允許的經過建構函式進行的隱式轉換。類建構函式在預設情況下都是隱式的。

在c++中乙個引數的建構函式(或者除了第乙個引數外其餘引數都有預設值的多參建構函式)承擔了兩個角色:一是構造器,二是預設且隱含的型別轉換操作符。所以在寫形如a a=n;這樣的**且恰好類a有單個引數的建構函式時編譯器自動呼叫這個建構函式建立乙個類a的物件a。

explicit不是過載區分符。乙個函式加和不加explicit修飾,不構成過載函式。

當乙個類的資料成員是另乙個類的物件時,這個物件稱為子物件。

當子物件b含有建構函式,則只能在含有物件b的類a的建構函式的成員初始化列表中進行初始化;如果子物件b不含建構函式,則物件b還可以在類a的建構函式體中初始化。

物件成員建構函式的呼叫順序取決於這些子物件成員在類中的定義順序,而與它們在成員初始化表中的位置無關。

在建立類物件時先呼叫各個物件成員的建構函式,初始化相應的子物件成員,然後才執行類的建構函式體,初始化本類中的其他資料成員。

析構函式的執行次序是先執行函式體,再以子物件在類a中定義的相反次序呼叫各類的析構函式。

在乙個類中可以定義另外乙個類的靜態子物件,靜態子物件需要在類外初始化。初始化格式為「子物件類名 所屬類::靜態子物件名[(參數列)]」

靜態子物件屬於類物件,和int等型別的靜態資料成員類似,只是在銷毀時要呼叫析構函式。

c++中的類通常是先宣告再使用。有時會遇到兩個類相互引用的情況,這時必然有乙個類在宣告之前就被使用。解決這個問題的方法是使用前向引用宣告。

前向引用宣告是在引用未宣告的類之前對該類進行預宣告,它只是為程式引入乙個代表該類的識別符號,類的具體宣告可以在程式的其他地方。

前向引用宣告僅引入乙個代表類的識別符號,在沒有遇到該類識別符號的實際宣告之前不能使用該類的任何成員。

例如:類a宣告在前,類b宣告在後。但類a的成員函式引用了b的物件和成員函式。這時,要對類b進行前向引用宣告。並且類a中引用類b物件的成員函式的實現必須放在類b的宣告之後,否則會出現不能識別類b的錯誤。

在乙個函式體內定義的類稱為區域性類。在區域性類中只能使用它的外圍作用域中的物件和函式進行聯絡,因為外圍作用域中的變數與該局部類的物件無關。區域性類的所有成員都必須定義在類體內,並且區域性類不能包含靜態成員。

在乙個類中宣告的類稱為巢狀類,從作用域的角度看,巢狀類被隱藏在外圍類之中,該類名只能在外圍類中使用,如果在外圍類的作用域外使用該類名,需要加名字限定。從訪問許可權的角度來看,巢狀類名與他的外圍類的物件成員名具有相同的訪問許可權規則。不能訪問巢狀類的物件中的私有成員函式,也不能對外圍類的私有巢狀類建立物件。巢狀類的成員函式可以在它的類體外定義。

定義巢狀類的作用在於隱藏類名,減少全域性的識別符號,從而限制使用者能否使用該類建立物件,這樣可以提高類的抽象能力,並且強調了兩個類(外圍類和巢狀類)之間的主從關係。

略,以後補充,見p112。

參考:《直擊招聘 程式設計師面試筆試 c++語言深度解析》李春葆、李筱池 主編

第三章 物件和封裝

為什麼使用物件導向 軟體出現的目的 物件導向設計和開發程式的好處 用物件導向的思想描述世界 類圖 使用類圖描述類 static關鍵字 static可以用來修飾屬性 方法 和 塊 static修飾和非static修飾的區別 什麼是封裝 物件導向三大特徵之一 封裝 封裝的概念 封裝 將類的某些資訊隱藏在...

第三章 類和成員

1 類和結構 1 類和結構實際上都是建立物件的模板,每個物件都包含資料,並提供了處理和訪問資料的方法。class phonecustomer 2 結構與類的區別是它們在記憶體中的儲存方式 類是儲存在堆 heap 上的引用型別,而結 構是儲存在堆疊 stack 上的值型別 訪問方式和一些特徵 如結構不...

第三章 核心物件

一 核心物件 1 每個核心物件都是一片兒記憶體 資料結構 由系統核心分配與訪問。2 令牌物件,事件物件,程序物件,訊號量物件,執行緒物件等都是核心物件。3 核心物件有安全限制,在建立之初就需要傳入乙個結構security attributes的安全描述符 4 類似的還有使用者物件和gdi物件等等,它...