?
目錄
?
1.前言
2.類的引入
3.類的定義
4.類的訪問限定符及封裝
4.1 訪問限定符
4.2 封裝
5.類的作用域
6.類的實例化
7.?結構體內存對齊規則
8.this指針
8.1 this指針的引出
8.2 this指針的特性
1.前言
C++ 是 基于面向對象 的, 關注 的是 對象 ,將一件事情拆分成不同的對象,靠對象之間的交互完
成。
2.類的引入
C 語言結構體中只能定義變量,在 C++ 中,結構體內不僅可以定義變量,也可以定義函數。 比如:
之前在數據結構初階中,用 C 語言方式實現的棧,結構體中只能定義變量 ;現在以 C++ 方式實現,
會發現 struct中也可以定義函數,而結構體的定義, 在 C++ 中更喜歡用 class 來代替
3.類的定義
class className{// 類體:由成員函數和成員變量組成}; ? // 一定要注意后面的分號
class 為 定義類的 關鍵字, ClassName 為類的名字, {} 中為類的主體,注意 類定義結束時后面 分
號不能省略 。
類體中內容稱為 類的成員: 類中的 變量 稱為 類的屬性 或 成員變量 ; 類中的 函數 稱為 類的方法 或者
成員函數 。
類的兩種定義方式:
1. 聲明和定義全部放在類體中,需注意:成員函數如果 在類中定義 ,編譯器可能會將其當成 內
聯函數 處理。
2. 類聲明放在 .h 文件中,成員函數定義放在 .cpp 文件中,注意: 成員函數名前需要加類名 ::
一般情況下,更期望采用第二種方式。
4.類的訪問限定符及封裝
4.1 訪問限定符
C++ 實現封裝的方式: 用類將對象的屬性與方法結合在一塊,讓對象更加完善,通過訪問權限選
擇性的將其接口提供給外部的用戶使用
【訪問限定符說明】
1. public 修飾的成員在類外可以直接被訪問
2. protected 和 private 修飾的成員在類外不能直接被訪問 ( 此處 protected 和 private 是類似的 )
3. 訪問權限 作用域從該訪問限定符出現的位置開始直到下一個訪問限定符出現時為止
4. 如果后面沒有訪問限定符,作用域就到 } 即類結束。
5. class 的默認訪問權限為 private , struct 為 public( 因為 struct 要兼容 C)
注意:訪問限定符只在編譯時有用,當數據映射到內存后,沒有任何訪問限定符上的區別
4.2 封裝
面向對象的三大特性: 封裝、繼承、多態 。
在類和對象階段,主要是研究類的封裝特性,那什么是封裝呢?
封裝:將數據和操作數據的方法進行有機結合,隱藏對象的屬性和實現細節,僅對外公開接口來
和對象進行交互。
封裝本質上是一種管理,讓用戶更方便使用類 。比如:對于電腦這樣一個復雜的設備,提供給用
戶的就只有開關機鍵、通過鍵盤輸入,顯示器, USB 插孔等,讓用戶和計算機進行交互,完成日
常事務。但實際上電腦真正工作的卻是 CPU 、顯卡、內存等一些硬件元件。
對于計算機使用者而言,不用關心內部核心部件,比如主板上線路是如何布局的, CPU 內部是如
何設計的等,用戶只需要知道,怎么開機、怎么通過鍵盤和鼠標與計算機進行交互即可。因此 計
算機廠商在出廠時,在外部套上殼子,將內部實現細節隱藏起來,僅僅對外提供開關機、鼠標以
及鍵盤插孔等,讓用戶可以與計算機進行交互即可 。
在 C++ 語言中實現封裝,可以 通過類將數據以及操作數據的方法進行有機結合,通過訪問權限來
隱藏對象內部實現細節,控制哪些方法可以在類外部直接被使用 。
5.類的作用域
類定義了一個新的作用域 ,類的所有成員都在類的作用域中 。 在類體外定義成員時,需要使用 ::
作用域操作符指明成員屬于哪個類域。
6.類的實例化
用類類型創建對象的過程,稱為類的實例化
1. 類是對對象進行描述的 ,是一個 模型 一樣的東西,限定了類有哪些成員,定義出一個類 并沒
有分配實際的內存空間 來存儲它;比如:入學時填寫的學生信息表,表格就可以看成是一個
類,來描述具體學生信息。
類就像謎語一樣,對謎底來進行描述,謎底就是謎語的一個實例。
謎語: " 年紀不大,胡子一把,主人來了,就喊媽媽 " 謎底:山羊
2. 一個類可以實例化出多個對象, 實例化出的對象 占用實際的物理空間,存儲類成員變量
3. 做個比方。 類實例化出對象就像現實中使用建筑設計圖建造出房子,類就像是設計圖 ,只設
計出需要什么東西,但是并沒有實體的建筑存在,同樣類也只是一個設計,實例化出的對象
才能實際存儲數據,占用物理空間
7.?結構體內存對齊規則
如何計算類對象的大小
1. 第一個成員在與結構體偏移量為 0 的地址處。2. 其他成員變量要對齊到某個數字(對齊數)的整數倍的地址處。注意:對齊數 = 編譯器默認的一個對齊數 與 該成員大小的較小值。VS 中默認的對齊數為 83. 結構體總大小為:最大對齊數(所有變量類型最大者與默認對齊參數取最小)的整數倍。4. 如果嵌套了結構體的情況,嵌套的結構體對齊到自己的最大對齊數的整數倍處,結構體的整體大小就是所有最大對齊數(含嵌套結構體的對齊數)的整數倍。
8.this指針
8.1 this指針的引出
我們先來定義一個日期類 Date
class Date{public :void Init ( int year , int month , int day ){_year = year ;_month = month ;_day = day ;}void Print (){cout << _year << "-" << _month << "-" << _day << endl ;}private :int _year ; ? ? // 年int _month ; ? ? // 月int _day ; ? ? ? // 日};int main (){Date d1 , d2 ;d1 . Init ( 2022 , 1 , 11 );d2 . Init ( 2022 , 1 , 12 );d1 . Print ();d2 . Print ();return 0 ;}
對于上述類,有這樣的一個問題:
Date 類中有 Init 與 Print 兩個成員函數,函數體中沒有關于不同對象的區分,那當 d1 調用 Init 函
數時,該函數是如何知道應該設置 d1 對象,而不是設置 d2 對象呢?
C++ 中通過引入 this 指針解決該問題,即: C++ 編譯器給每個 “ 非靜態的成員函數 “ 增加了一個隱藏
的指針參數,讓該指針指向當前對象 ( 函數運行時調用該函數的對象 ) ,在函數體中所有 “ 成員變量 ”
的操作,都是通過該指針去訪問。只不過所有的操作對用戶是透明的,即用戶不需要來傳遞,編
譯器自動完成 。
8.2 this指針的特性
1. this 指針的類型:類類型 * const ,即成員函數中,不能給 this 指針賦值。
2. 只能在 “ 成員函數 ” 的內部使用
3. this 指針本質上是 “ 成員函數 ” 的形參 ,當對象調用成員函數時,將對象地址作為實參傳遞給
this 形參。所以 對象中不存儲 this 指針 。
4. this 指針是 “ 成員函數 ” 第一個隱含的指針形參,一般情況由編譯器通過 ecx 寄存器自動傳
遞,不需要用戶傳遞
?