網站首頁 編程語言 正文
文章轉自 微信公眾號:Coder梁(ID:Coder_LT)
一、類的定義
根據C++ Primer
中的描述,類的定義是一種將抽象轉換為用戶定義類型的C++工具。也就是說類的實質是一種用戶自定義類型,它可以將數目表示和操作數據的方法組合成一個整潔的包。
在實際開發當中,想要實現一個類,并編寫一個使用它的程序是相對比較復雜的,涉及多個步驟。
通常,我們會將類的定義放在頭文件當中,并將實現的代碼放在源代碼文件中。我們來看C++ Primer
當中的一個例子:一個關于股票買賣的類。
首先是類的定義,寫在stock00.h文件中:
#ifndef STOCK00_H_ #define STOCK00_H_ #include <string> class Stock { ? ? private: ? ? ?std::string company; ? ? ?long shares; ? ? ?double share_val; ? ? ?double total_val; ? ? ?void set_tot() {total_val = shares * share_val;} ? ? public: ? ? ?void accquire(const std::string &co, long n, double pr); ? ? ?void buy(long num, double price); ? ? ?void sell(long num, double price); ? ? ?void update(double price); ? ? ?void show(); }; #endif
首先是關鍵字class
,它表示我們聲明的是一個類,一般類名我們使用大駝峰命名法定義。
其次在這個類的定義當中,我們看到了兩個新出現的關鍵字private
和public
。這兩個關鍵字描述了對類成員的訪問控制,使用類對象的程序,都可以直接訪問公有部分(public
),但無法訪問對象的私有成員。
想要獲取私有成員,只能通過公有的成員函數。比如在上面這個例子當中,我們想要修改share_val
只能通過公有的方法sell
或buy
,而無法直接對變量的值進行修改。防止程序直接訪問數據修改數據被稱為數據隱藏。
除了public
和private
,C++當中還提供了第三個關鍵字叫做protected
,這個關鍵字和類的繼承有關,我們將會在之后的文章當中進行討論。
數據隱藏的思想其實是認為類中的成員變量的所有權應該屬于類本身,當我們需要對類中的數據進行讀取和修改的時候,應當通過類提供的公開方法,而不是直接操作類中值。這被認為是一種面向對象的思想,即只能通過類提供的方法訪問數據,而不應該直接訪問數據。
C++正是基于這種面向對象的思想設計的,所以類中的成員默認是private的,我們可以省去private關鍵字:
class World { ? ? float mass; ? ? char name[30]; public: ? ? void tellall(); ? ? ... };
我們從類的描述看上去很像是包含了成員函數以及數據隱藏的結構體,但實際上這是因為C++對結構體進行了拓展,讓它具有了和類相同的特性。在C語言當中,結構體是沒有這么多特性的。
比如我們可以給結構體設計構造函數,也可以給結構體添加成員函數,甚至結構體也可以繼承、派生和多態。
它們之間唯一的區別是,結構體的默認類型是public
,而類是private
。所以通常使用類來實現對象,而結構體只用來結構化地存儲數據。
另外多說一句,數據隱藏的面向對象理念并不適用于所有語言。比如Python,Python當中的類中的成員變量默認是public,且沒有private
關鍵字。
二、類的實現
當我們完成了類定義之后, 還需要來實現類當中的函數。
比如我們在stock00.h當中定義了一個類:
#ifndef STOCK00_H_ #define STOCK00_H_ #include <string> class Stock { ? ? private: ? ? ?std::string company; ? ? ?long shares; ? ? ?double share_val; ? ? ?double total_val; ? ? ?void set_tot() {total_val = shares * share_val;} ? ? public: ? ? ?void accquire(const std::string &co, long n, double pr); ? ? ?void buy(long num, double price); ? ? ?void sell(long num, double price); ? ? ?void update(double price); ? ? ?void show(); }; #endif
1.成員函數
在這個定義當中,我們只是聲明了函數,并沒有具體實現函數的邏輯。
我們通常會在同名的cpp
文件當中實現,實現的時候,需要使用作用域解析運算符來表示函數所屬的類:
void Stock::update(double price) { ? ? ... }
這樣就表明了update
函數所屬Stock
這個類,這也就意味著我們可以創建屬于其他類的同名函數:
void Buffoon::update() { ? ? ... }
其次,我們在成員函數當中,可以訪問private
限定的成員變量。比如說在show
函數當中,我們可以這樣實現:
void Stock::show() { ? ? std::cout << company << shares << share_val << total_val << endl; }
雖然company
,shares
都是類的私有成員,但在成員方法當中,一樣可以正常訪問。
再次,我們在成員方法當中調用另外一個成員方法,可以不需要解析運算符。比如我們要在show函數內調用update
函數,直接使用update()
即可,而無需前面的Stock::。
2.內聯函數
我們再回過頭來看一下Stock
這個類的定義,在類的定義當中,有一個叫做set_tot
的函數。我們直接在類當中實現了邏輯。雖然同樣是成員函數,但是在類當中直接實現的函數是有所區別的。在類聲明當中實現的函數,會被視為是內聯函數。
一般我們會把一些比較簡短的函數在類的聲明當中直接實現,當然我們也可以使用關鍵字inline
,手動指定某個函數是內聯的。
class Stock { ? ? private: ? ? void set_tot(); ? ? public: ? ? ... }; inline void Stock::set_tot() { ? ? total_val = shares * share_val; }
相關推薦
- 2022-08-10 Python格式化輸出的具體實現_python
- 2022-12-26 C++?Boost?log日志庫超詳細講解_C 語言
- 2022-10-14 Android適配器和適配器視圖
- 2022-08-21 Caffe圖像數據轉換成可運行leveldb?lmdb文件_其它綜合
- 2022-12-23 python類中的self和變量用法及說明_python
- 2022-03-24 使用sublime?Text3過程中的各種問題的解決_相關技巧
- 2022-07-15 服務器間如何實現文件共享_服務器其它
- 2022-09-25 將rosbag中的imu數據轉成txt文件
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支