C++感受11-Hello Object 成員版

當一個C++程序員在設計類型時,他在想什么?

  1. 這一類型的對象,需要擁有哪些屬性數據?
  2. 這一類型的對象,它將擁有哪些功能?
  3. 這一類型的對象,它的各個屬性和功能之間,有哪些關聯關系?

(課堂視頻在第3點,建議先閱讀文字內容)

1. 為自定義類型添加成員

是時候來關心對象自身的屬性與功能了!在C++中,對象的屬性,通常稱為“成員數據”,對象的功能,通常稱為“成員函數”。

前兩節課中,我們還創造過“恐豬”和“恐蛇”物種啊,這兩種類型,按說就應該很厲害才是。但可惜,它們只是在類型的名字上,聽起來很厲害的樣子,其實,我們也只是為它們定制了生和死的功能。

假設我們要寫一個游戲程序,里面就有像“恐豬”和“恐蛇”這樣的怪獸。游戲的玩家可能需要殺死它們。那么,怪獸是不是要有像血氣值、攻擊力、防護力這樣的數據?同時,除了生和死,怪獸對外要有攻擊和被攻擊的能力。

攻擊的意思就是,玩家進入某一只怪獸的某個范圍時,怪獸可能會主動攻擊玩家,對玩家造成一定的傷害。被攻擊則相反,如果玩家給它一拳,也就是怪獸被攻擊了,這時怪獸是直接掛掉?還是說只是血氣值減少一丟丟說?或者說給它一拳以后,它反倒更加興奮了?

血氣值,攻擊力,防護值 ,它們就是一個類型或者一個對象的屬性,通常它們以一種特殊的數據形式出現,稱為成員數據。而:怪獸會攻擊人也會被攻擊,這些就是一個類型或一個對象的能力,通常以特殊的函數形式的出現,稱為成員函數,在更多對面向對象的語言,也稱為“方法”。

2. 理解方法和屬性之間的關系

結合怪獸這個案例,來看看,在定義一個組合類型時,我們需要表達什么?

1、這一類型的對象,需要擁有哪些屬性數據?
2、這一類型的對象,它將擁有哪些功能?
3、這一類型的對象,它的各個屬性和功能之間,有哪些關聯關系?

其中理解第三點,非常重要:屬性和功能之間,通常存在緊密的關系。一個功能的實施,可能會引發一些屬性值的變化。比如,怪獸被攻擊,通常是不是它的血氣值 ,也就是游戲中常見的,頂在怪獸頭上的“生命條”,會變短;當然,也可以“防護值”這個屬性也考慮上,一只怪獸當前的“防護值”越大,比如說它正好穿著鎧甲,那么,它被攻擊時,血氣值一下子減少的數量,通常就慢一些。

再來看“攻擊力”這個屬性,和“攻擊”這個能力的關系——也很好理解 :這只怪獸當前攻擊力越強,那么對玩家造成的傷害就越大。

再來看真實一些的例子:賽車。成員數據可以有 油量、速度、方向等等,其成員方法則可以有跑(行駛)、轉向、踩油門(也就是加速),踩剎車(也就是減速等等)。大家肯定能夠想象得出,汽車的這些成員數據和成員函數之間的合理關系。

如果把汽車的例子進一步簡化到只有速度和油量兩個數據,以及踩油門和踩剎車兩個方法。那么這個賽車類型,用結構/struct的來表達的偽代碼,大概就長這樣子:

// 偽代碼
struct 賽車
{int 速度 = 0;int 油量 = 100;賽車 () {cout << “賽車啟動啦!油量100,速度為零,請踩油門!” << endl;};void 踩油門() { 加大速度, 消耗油量 };void 踩剎車() { 降低速度  };
};

基本關系就是,調用一個賽車對象踩油門的方法,車就會加大速度,同時消耗更多的油;而調用踩剎車方法,則會降低速度。

實際定義一個完善的汽車的類型,還是有很多邏輯關系要想清楚的。比如踩油門并不一定會提速,因為汽車可能沒油了。

?

3. 課堂視頻

ff13-HelloObject-成員版

4. 完整代碼

#include <iostream>// 定義人類結構
struct Person
{Person() { std::cout << "哇哇~" << std::endl; };~Person() { std::cout << "嗚嗚~" << std::endl; }// 自我介紹void Introduce() // 成員函數,方法{std::cout << "大家好,我叫 " << name << std::endl;}std::string name; // 成員數據,屬性
};int main()
{Person xiaoA;xiaoA.name = "小A";xiaoA.Introduce();std::cout << "------------------\n";auto* xiaoB = new Person;// 寫法一,取值后再訪問成員(*xiaoB).name = "小B";(*xiaoB).Introduce();delete xiaoB;std::cout << "------------------\n";// 寫法二:簡易寫法“箭頭訪問符”auto* xiaoC = new Person;xiaoC->name = "小C";xiaoC->Introduce();delete xiaoC;
}

運行效果:

哇哇~
大家好,我叫 小A
------------------
哇哇~
大家好,我叫 小B
嗚嗚~
------------------
哇哇~
大家好,我叫 小C
嗚嗚~
嗚嗚~

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/15308.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/15308.shtml
英文地址,請注明出處:http://en.pswp.cn/web/15308.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

OceanBase的存儲架構與傳統LSM-Tree架構的異同|OceanBase數據轉儲合并技術解讀(二)

前篇博文將OceanBase的存儲架構巧妙地與自然界中的“水生態”進行了類比&#xff0c;今日我們轉變視角&#xff0c;聚焦在與擁有相同LSM-Tree架構的其他產品的比較&#xff0c;深入探討OceanBase相較于它們所展現出的獨特性能。 眾所周知&#xff0c;OceanBase數據庫的存儲引擎…

element-ui 前端ui框架用法開發指南(2024-05-22)

Element&#xff0c;一套為開發者、設計師和產品經理準備的基于 Vue 2.0 的桌面端組件庫 1、npm安裝 // npm安裝&#xff1a;npm install element-ui --save 能更好地和 webpack 打包工具配合使用 2、cdn在線引入 訪問最新版本的資源地址 - element-uiThe CDN for element-u…

RedHat9 | DNS剖析-配置主DNS服務器實例

一、實驗環境 1、BIND軟件包介紹 BIND軟件是一款開放源碼的DNS服務器軟件&#xff0c;由美國加州大學Berkeley分校開發和維護&#xff0c;全稱為Berkeley Internet Name Domain。該軟件在DNS&#xff08;域名系統&#xff09;領域具有重要地位&#xff0c;是目前世界上使用最…

使用OpenCV dnn c++加載YOLOv8生成的onnx文件進行目標檢測

在網上下載了60多幅包含西瓜和冬瓜的圖像組成melon數據集&#xff0c;使用 LabelMe 工具進行標注&#xff0c;然后使用 labelme2yolov8 腳本將json文件轉換成YOLOv8支持的.txt文件&#xff0c;并自動生成YOLOv8支持的目錄結構&#xff0c;包括melon.yaml文件&#xff0c;其內容…

信息系統管理工程師問答題

信息系統管理工程師問答題 系統管理安全兩方面 安全測試 入侵檢測系統的功能 用戶標識與驗證常用的3種方法 (1) 要求用戶輸入一些保密信息&#xff0c;例如用戶名稱和密碼&#xff1b; (2) 采用物理識別設備&#xff0c;例如訪問卡、鑰匙或令牌&#xff1b; (3) 采用生物統計學…

Python怎樣定位并刪除Sql語句中不確定的查詢條件

1.問題場景描述: 在sql語句中經常會有查詢條件是:查找多個訂單簽訂日期范圍的數據,但具體的日期范圍是不確定,我們如何來查找定位 例如:查詢條件語句的部分如下圖: 目標是: 1)定位字符串:t_contract_order.sign_date 2)最終得到結果: 解決問題思路: 1)定位要找的字符串起始位置…

【學習心得】PyTorch的知識要點復習(持續更新)

PyTorch知識要點復習&#xff0c;目的是為了鞏固PyTorch基礎、快速回顧、深化理解PyTorch框架。這篇文章會持續更新。 一、本文的一些說明 知識點梳理&#xff1a;我將PyTorch的核心概念和高級技巧進行了系統化的整理&#xff0c;從基礎的張量操作到復雜的模型構建與訓練。這樣…

【Linux】進程終止與進程等待

目錄 進程終止 errno exit和_exit 進程等待 wait和waitpid 宏&#xff1a;WIFEXITED 非阻塞等待 進程終止 下面要談的一個話題就是進程終止&#xff0c;就是說一個進程退出了&#xff0c;可能有三種情況 1.進程代碼執行完&#xff0c;結果是正確的 2.進程代碼執行完&…

【九十二】【算法分析與設計】875. 愛吃香蕉的珂珂,410. 分割數組的最大值,機器人跳躍問題,二分答案法

875. 愛吃香蕉的珂珂 - 力扣&#xff08;LeetCode&#xff09; 珂珂喜歡吃香蕉。這里有 n 堆香蕉&#xff0c;第 i 堆中有 piles[i] 根香蕉。警衛已經離開了&#xff0c;將在 h 小時后回來。 珂珂可以決定她吃香蕉的速度 k &#xff08;單位&#xff1a;根/小時&#xff09;。每…

【活動】開源與閉源大模型:探索未來趨勢的雙軌道路

&#x1f308;個人主頁: 鑫寶Code &#x1f525;熱門專欄: 閑話雜談&#xff5c; 炫酷HTML | JavaScript基礎 ?&#x1f4ab;個人格言: "如無必要&#xff0c;勿增實體" 文章目錄 開源與閉源大模型&#xff1a;探索未來趨勢的雙軌道路引言一、開源大模型&#…

翻譯《The Old New Thing》- The importance of the FORMAT_MESSAGE_IGNORE_INSERTS flag

The importance of the FORMAT_MESSAGE_IGNORE_INSERTS flag - The Old New Thing (microsoft.com)https://devblogs.microsoft.com/oldnewthing/20071128-00/?p24353 Raymond Chen 2007年11月28日 FORMAT_MESSAGE_IGNORE_INSERTS 標志的重要性 簡要 文章討論了使用FormatMes…

評估企業的業務是否存在高風險的六個步驟

風險的幽靈使得組織別無選擇&#xff0c;只能改善各種網絡風險的總體管理。以下是一個基于信息安全論壇的IRAM2方法論的分步過程&#xff0c;網絡安全和風險從業者可以利用它來評估和管理信息風險。 第1步&#xff1a;范圍界定練習 范圍界定練習的目標是提供一個以業務為中心…

基于springboot+vue的招聘信息管理系統

開發語言&#xff1a;Java框架&#xff1a;springbootJDK版本&#xff1a;JDK1.8服務器&#xff1a;tomcat7數據庫&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09;數據庫工具&#xff1a;Navicat11開發軟件&#xff1a;eclipse/myeclipse/ideaMaven包&#xff1a;…

K8s的常用命令以及yaml文件的創建

目錄 一、聲明式管理方法&#xff1a;YAML文件 1、yaml文件簡介 2、yaml和json的主要區別&#xff1a; 3、YAML的語法格式 4、yaml文件組成部分 ①控制器定義 5、查看api資源版本標簽 6、編寫nginx-deployment.yaml資源配置清單 6.1創建資源對象 6.2查看創建的pod資源…

使用python將一段文本寫入一個txt文件中且先格式化文件名

有一段文本內容&#xff0c;有“標題”和“內容”組成。 任務&#xff1a;要將這段文本&#xff0c;存放到一個txt文件中&#xff0c;文件名為當天的日期加上“標題”內容。因為“標題”內可能有/<>之類的&#xff0c;還需要格式化一下。 已經將上述功能都寫成了函數&a…

安卓手機APP開發__近距離無線通信(NFC)概述

安卓手機&#xff21;&#xff30;&#xff30;開發&#xff3f;&#xff3f;近距離無線通信(NFC)概述 概述 近距離無線通信 (NFC) 是一組近距離無線技術&#xff0c;距離通常不超過 4 厘米才能 發起連接。通過 NFC&#xff0c;您可以在 NFC 標簽和 Android 設備之間&#xf…

【Redis】 String類型的內部編碼與使用環境

文章目錄 &#x1f343;前言&#x1f334;內部編碼&#x1f384;典型使用場景&#x1f6a9;緩存功能&#x1f6a9;計數&#xff08;Counter&#xff09;功能&#x1f6a9;共享會話&#xff08;Session&#xff09;&#x1f6a9;驗證碼功能 ?總結 &#x1f343;前言 本篇文章重…

Unity-Sprite Atlas+UGUI系統的運行原理

每日一句&#xff1a;別聽世俗耳語&#xff0c;看自己的風景就好 目錄 SA的原理&#xff1a; SA的優點&#xff1a; SA的缺點&#xff1a; DrawCall是什么&#xff1f; 批處理是什么&#xff1f; 我們先了解一下UGUI系統的運行原理吧&#xff01; 提到圖集優化&#xff0…

cocosCreator動態生成二維碼

cocosCreator 版本&#xff1a;3.7.2 開發語言&#xff1a;typeScript 我們在游戲開發中&#xff0c;經常會生成一個專屬于玩家個人的二維碼&#xff0c;比如說推廣、充值等功能。 接到這個任務&#xff0c;在網上找了下&#xff0c;還是有很多教程的。但是這些教程大部分都是用…

Ollydbg動態分析MessageBoxA輸出hellow world

一、目的 找到main函數找到調用的MessageBoxA函數 測試源碼 #include <iostream> #include <windows.h>int main() {MessageBoxA(NULL, "Hellow World", "Title", MB_OK);return 1; }二、快捷鍵 指令快捷鍵說明RestartCtrlF2重新開始調試S…