C++講解—類(1)

在 C++ 中,類是一個關鍵概念,憑借其封裝和繼承的特性,能夠助力程序員之間實現高效的分工協作,共同完成復雜的大型項目。我們先從最簡單的概念入手,再進行更深層次的了解和應用。

1. 類的定義

類是用戶自定義的一種數據類型,它將數據和對數據進行操作的成員函數封裝在一起,用于表示現實世界中的事物或抽象概念。

1.1 類和函數有什么區別呢?

如果將程序比作一個工廠,函數就像是工廠中的各種機器,每臺機器完成特定的任務;而類就像是工廠中的工人,他們不僅攜帶工具(成員變量),還掌握技能(成員函數),可以獨立地完成復雜的任務。
如果是實現一個 獨立的、簡單的功能,且不需要管理狀態,使用函數可能更合適。**如果功能涉及到 數據和行為的結合,并且需要管理狀態,使用類會更合適。**如管理一個對象的狀態,用戶檔案。還比如需要將數據和操作封裝在一起,操作一些圖形,文件。或者說需要較為復雜的繼承,例如游戲角色的分化,從單純的角色分化為主角和各類小怪。

1.2 類和函數的例子

讓我們以一個銀行賬戶的數據管理為例,如果我們只是使用函數的話,那么有以下代碼:

#include <string>
#include <iostream>
using namespace std;int main()
{string liyang_name = "李陽"; // 李陽的賬戶名稱string liyang_number = "12345678"; // " 賬號long liyang_balance = 1000; // " 賬戶余額string zhouyan_name = "周燕"; // 周燕的賬戶名稱string zhouyan_number = "87654321"; // " 賬號long zhouyan_balance = 200; // " 賬戶余額liyang_balance -= 200; // 李陽取出 200 元zhouyan_balance += 100; // 周燕存入 100 元cout << "■李陽的賬戶:\"" << liyang_name << "\" (" << liyang_number << ") " << liyang_balance << "元\n";cout << "■周燕的賬戶:\"" << zhouyan_name << "\" (" << zhouyan_number << ") " << zhouyan_balance << "元\n";
}

在這里,我們想要用不同的賬戶進行存取,只能在變量名的命名中進行變化,每次都要建立新的變量,管理十分復雜。那么我們試著將賬戶看作一個類,這個類里面有各種成員,每個成員代表了不同的賬戶屬性。當想要建立用戶的賬戶時,就相當于建立了一個實體對象。每進行一次存取,就是存入一個數據,就只需要那么只需要操作這一個實體對象里面的數據即可。
類和函數的區別
如果我們使用類去存儲數據,就可以使用下面的代碼:

#include <string>
#include <iostream>
using namespace std;class Account {//聲明類的名字和成員
public:// 先不用管,還沒有學到string name;    // 賬戶名稱string number;  // 賬號long balance;   // 賬戶余額
};int main()
{Account liyang;    // 李陽的賬戶Account zhouyan;   // 周燕的賬戶liyang.name = "李陽";       // 李陽的賬戶名稱liyang.number = "12345678"; // 賬號liyang.balance = 1000;      // 賬戶余額zhouyan.name = "周燕";       // 周燕的賬戶名稱zhouyan.number = "87654321"; // 賬號zhouyan.balance = 200;      // 賬戶余額liyang.balance -= 200;      // 李陽取出200元zhouyan.balance += 100;     // 周燕存入100元cout << "■李陽的:賬戶" << liyang.name << " (" << liyang.number<< ") " << liyang.balance << "元\n";cout << "■周燕的賬戶:" << zhouyan.name << " (" << zhouyan.number<< ") " << zhouyan.balance << "元\n";
}

而怎樣理解類和對象的關系呢?就可以概括為類是抽象的,而對象是類的實體。就是月餅模具和月餅本身的關系,而你想選擇的餡料和餅皮材料便是對象的實體數據,不一樣的材料,做出了不一樣的月餅,也便有了不一樣的月餅。

2. 類的成員-變量與函數

1.成員變量與成員函數

類的主體由成員變量成員函數組成,以上個銀行賬戶管理系統的代碼為例,這里面只有成員變量,并沒有成員函數。那么我們每次存錢或者取錢的時候,要在main函數中手動進行加減余額,這相當于多了一次理解的規則,每次存入100元錢相當于要使用這個命令balance += 100,那么如果將這個命令直接變為語言可以理解的規則,我們直接使用deposit(100) (deposit英文釋義:存入) 這個語句,就可以直接讓銀行余額變多100元了。這里就可以使用成員函數來實現這件事了。

//在類中寫下存入函數void deposit(long amnt) {crnt_balance += amnt;}//在main函數中直接調存入函數zhouyan.deposit(100);   // 周燕存入100元

3. 公有成員函數與私有成員變量

類中的成員變量成員函數,它們通過訪問限定符來控制外部對它們的訪問權限, 分別為private(私有)、protected(受保護)或 public(公有)。私有成員只能在類的內部被訪問。類的外部代碼和派生類都不能直接訪問私有成員。受保護成員只能在類的內部和派生類(子類)中被訪問。類的外部代碼不能直接訪問受保護成員。公有成員可以在類的外部被訪問。任何對象都可以直接訪問公有成員。

這種分類并不是固定的,而是根據設計需求來決定的。不過,通常情況下,成員變量被聲明為 private成員函數被聲明為 public,這種設計有其合理性和優勢。成員變量的私有保證了數據的封裝性,外部代碼不可以修改數據的類型;成員函數作為類的接口,可以通過外部代碼與類的對象進行交互。

class Account {
private:string full_name;  // 賬戶名稱string number;     // 賬號long crnt_balance; // 賬戶余額public:// 返回賬戶名稱string name() {return full_name;}// 返回賬號string no() {return number;}// 返回賬戶余額long balance() {return crnt_balance;}// 存入void deposit(long amnt) {crnt_balance += amnt;}// 取出void withdraw(long amnt) {crnt_balance -= amnt;}
};

4. 構造函數

在成員函數中,必須要有的便是構造函數,構造函數是C++中的一種特殊函數,它在創建對象時自動被調用,用于初始化對象。構造函數的名稱必須與類名相同,并且沒有返回類型(包括void)。構造函數的主要作用是為對象的成員變量賦初值,確保對象在創建時處于一個已知的、有效的狀態。

class Account {
private:string full_name;  // 賬戶名稱string number;     // 賬號long crnt_balance; // 賬戶余額public:// 構造函數Account(string name, string num, long amnt) {full_name = name;  // 賬戶名稱number = num;      // 賬號crnt_balance = amnt; // 賬戶余額}
};int main()
{Account liyang("李陽", "12345678", 1000);  // 初始化李陽的賬戶Account zhouyan("周燕", "87654321", 200);  // 初始化周燕的賬戶
/
}

5.完整的示例代碼及其類的成員

// 銀行賬戶類(第2版)及類的使用例程
#include <string>
#include <iostream>
using namespace std;class Account {
private:string full_name;  // 賬戶名稱string number;     // 賬號long crnt_balance; // 賬戶余額public:// 構造函數Account(string name, string num, long amnt) {full_name = name;  // 賬戶名稱number = num;      // 賬號crnt_balance = amnt; // 賬戶余額}// 返回賬戶名稱string name() {return full_name;}// 返回賬號string no() {return number;}// 返回賬戶余額long balance() {return crnt_balance;}// 存入void deposit(long amnt) {crnt_balance += amnt;}// 取出void withdraw(long amnt) {crnt_balance -= amnt;}
};int main()
{Account liyang("李陽", "12345678", 1000);  // 李陽的賬戶Account zhouyan("周燕", "87654321", 200);  // 周燕的賬戶liyang.withdraw(200);   // 李陽取出200元zhouyan.deposit(100);   // 周燕存入100元cout << "■李陽的賬戶:" << liyang.name() << " (" << liyang.no()<< ") " << liyang.balance() << "元\n";cout << "■周燕的賬戶:" << zhouyan.name() << " (" << zhouyan.no()<< ") " << zhouyan.balance() << "元\n";
}

類的成員

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

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

相關文章

什么是Hadoop Yarn

Hadoop YARN&#xff1a;分布式集群資源管理系統詳解 1. 什么是YARN&#xff1f; YARN&#xff08;Yet Another Resource Negotiator&#xff09;是 Apache Hadoop 生態系統中的資源管理和作業調度系統&#xff0c;最初在 Hadoop 2.0 中引入&#xff0c;取代了 Hadoop 1.0 的…

項目開發中途遇到困難的解決方案

1. 正視困難&#xff0c;避免逃避 開發遇阻時&#xff0c;退縮會帶來雙重損失&#xff1a;既成為"失敗者逃兵"&#xff0c;又損害職業信心1。 行動建議&#xff1a; 立即向團隊透明化問題&#xff08;如進度延遲、技術瓶頸&#xff09;&#xff0c;避免問題滾雪球…

Blender硬表面建模篇收集學習建模過程中的Demo

c 齒輪 創建一個圓柱體&#xff0c;選擇側面的所有&#xff0c;然后進行隔斷選擇&#xff0c;兩次擠出面&#xff0c;一次縮放面&#xff0c;通過圓柱面三次插入面縮放擠出得到齒輪中心&#xff0c;選中齒輪的鋸齒中間&#xff0c;然后進行相同周長選擇行選擇齒與齒中間的面&…

Chromium 136 編譯指南 macOS篇:獲取源代碼(四)

1. 引言 在現代軟件開發的宏大版圖中&#xff0c;源代碼的獲取往往標志著從理論探索向實踐應用的關鍵轉折。對于Chromium 136這樣一個擁有超過2500萬行代碼、涉及數百個第三方庫的超大規模開源項目而言&#xff0c;源代碼的獲取不僅僅是簡單的文件下載&#xff0c;更是一個涉及…

OpenCV C++ 邊緣檢測與圖像分割

一、邊緣檢測 在數字圖像處理領域&#xff0c;邊緣檢測是一項至關重要的基礎技術。它如同為圖像賦予 “骨架”&#xff0c;幫助計算機快速識別圖像中的物體輪廓、形狀與結構&#xff0c;廣泛應用于目標識別、圖像分割、圖像配準等多個領域。 1.1 概念 邊緣檢測的核心目標是找…

線段樹(2025年6月14日)

原文 https://www.beiweidoge.top/132.html P1&#xff1a;求最大值1 題目描述 題目描述 小明給了你n個數字&#xff0c;你需要依次輸出&#xff1a; 1到n的最大值&#xff0c;1到n/2的最大值&#xff0c;n/21到n的最大值&#xff0c;1到n/4的最大值&#xff0c;n/41到n/2…

滲透實戰PortSwigger Labs AngularJS DOM XSS利用詳解

本Lab學習到關于AngularJS的 xss 漏洞利用 直接輸入回顯頁面&#xff0c;但是把<>進了 html 編碼了 當我們輸入{{11}}&#xff0c;沒有當作字符處理&#xff0c;而是執行了 {{}} 是多種前端框架&#xff08;如 Vue、Angular、Django 模板等&#xff09;中常見的模板插值語…

Ubuntu 多網卡安全路由配置(SSH 不斷線版)

Ubuntu 多網卡路由配置筆記&#xff08;內網 外網同時通&#xff09;&#xff08;SSH斷線版&#xff09;文章瀏覽閱讀386次&#xff0c;點贊4次&#xff0c;收藏5次。本文介紹了Ubuntu 如何配置雙網卡設備的路由規則&#xff0c;使默認流量走外網&#xff08;192.168.2.0/24&a…

基于昇騰NPU部署llamafactory單機多卡微調Qwen3教程

1. 進入華為云 華為云首頁 點擊右上角控制臺 2.進入ModelArts 點擊搜索框->搜索“ModelArts”->選擇AI開發平臺ModelArts->進入平臺后點擊開發者空間 3.創建Notebook 3.1在開發者空間中點擊Notebook->在西南貴陽一下點擊創建Notebook 3.2進入創建Notebook頁…

關于XES文件格式諸多問題

1. 格式類型是什么&#xff1f; case:concept:name (案例ID) - 必須是字符串類型concept:name (活動名稱) - 字符串類型time:timestamp - 必須是datetime類型 2. 如何修改&#xff1f; data[case:concept:name] data[case:concept:name].astype(str)data[concept:name] data…

數據融合平臺有哪些?在數據治理中發揮什么作用?

目錄 一、常見的數據融合平臺 &#xff08;一&#xff09;傳統數據融合平臺 &#xff08;二&#xff09;實時數據融合平臺 &#xff08;三&#xff09;云數據融合平臺 二、數據融合平臺在數據治理中的作用 &#xff08;一&#xff09;提升數據質量 &#xff08;二&#…

??Linux:XFS 文件系統擴容完整指南

???問題背景?? 在擴展 Linux 根目錄 / 時,我遇到了一個錯誤: sudo resize2fs /dev/uos/root resize2fs: 超級塊中的幻數有錯 嘗試打開 /dev/uos/root 時找不到有效的文件系統超級塊。 經過排查,發現根本原因是 ??文件系統類型是 XFS??,而 resize2fs 僅適用于 e…

網絡安全之CTF專題賽RE題解

easyre hap文件改成zip格式然后解壓去反編譯abc文件即可拿到源碼 這里推薦一個網站.abcD 蠻好用的 下載反編譯結果&#xff0c;解壓后用vscode打開分析。 這里可以看到一些目錄結構&#xff0c;我們先看看flag目錄 x_2_2.count位1000000的時候就會輸出flag那么大概率是一個點…

a padding to disable MSIE and Chrome friendly error page

問題 a padding to disable MSIE and Chrome friendly error page 解決 nginx 代理地址 配錯了

71、C# Parallel.ForEach 詳解

Parallel.ForEach 是 .NET Framework 4.0 引入的并行編程功能的一部分&#xff0c;位于 System.Threading.Tasks 命名空間中。它允許你對集合中的元素進行并行處理&#xff0c;可以顯著提高處理大量數據時的性能。 基本用法 using System; using System.Collections.Generic;…

生產者-消費者模式在不同操作系統上的行為差異

在多線程編程中&#xff0c;生產者-消費者模式是一種常見的設計模式&#xff0c;用于解決線程間的數據同步問題。最近&#xff0c;我在 Linux 和 macOS 上運行同一個生產者-消費者模式的程序時&#xff0c;發現它們表現出不同的行為。本文將介紹這個現象、分析其原因&#xff0…

【JS-4.1-DOM獲取元素操作】深入理解DOM操作:高效獲取頁面元素的方法與實踐

在現代Web開發中&#xff0c;DOM&#xff08;文檔對象模型&#xff09;操作是前端工程師的必備技能。而DOM操作的第一步&#xff0c;往往是從頁面中獲取我們需要操作的元素。本文將全面介紹各種獲取頁面元素的方法&#xff0c;分析它們的性能特點&#xff0c;并提供最佳實踐建議…

UE5錯誤 Linux離線狀態下錯誤 請求失敗libcurl錯誤:6無法解析主機名

UE5錯誤 Linux離線狀態下錯誤 請求失敗libcurl錯誤&#xff1a;6無法解析主機名 完整描述問題解析解決方法 完整描述 loghttp&#xff1a;warning&#xff1a;ox015cba21400:request failed libcurl error :6 (couldn’t resolve host name ) 問題解析 這是因為在離線狀態下…

深度學習實戰111-基于神經網絡的A股、美股、黃金對沖投資策略(PyTorch LSTM)

文章目錄 一、A股與美股對沖互補投資方案1. 現象與邏輯2. 對沖互補投資思路3. 資金分配樣例4. 最大化收益的關鍵二、對沖互補投資思路1. 資金分配原則2. 動態調整機制3. 對沖操作三、投資方案樣例1. 初始資金分配(假設總資金10萬元)2. 動態調整舉例情景一:美股進入牛市,A股…

在線教育平臺敏捷開發項目

項目背景 產品名稱&#xff1a;LearnFlow&#xff08;在線學習平臺&#xff09; 核心目標&#xff1a;6個月內上線MVP&#xff08;最小可行產品&#xff09;&#xff0c;支持課程學習、進度跟蹤、測驗功能。 團隊構成&#xff1a; 產品負責人&#xff08;PO&#xff09;1人 S…