C++結構體初始化與成員函數實現語法詳解

C++結構體初始化與成員函數實現語法詳解

一、結構體靜態成員初始化語法

在C++中,靜態成員變量需要在類外部進行定義和初始化。提供的代碼展示了如何為MAIN_PROPULSION_CAN類的靜態成員變量進行初始化:

MAIN_PROPULSION_CAN::VoltageThresholds MAIN_PROPULSION_CAN::currentVoltageThresholds = {0, 800, 750  // 0-800V, 高電壓閾值750V
};

語法解析:

  1. MAIN_PROPULSION_CAN::VoltageThresholds - 完全限定類型名,表示屬于MAIN_PROPULSION_CAN類的VoltageThresholds類型
  2. MAIN_PROPULSION_CAN::currentVoltageThresholds - 靜態成員變量的完全限定名
  3. = {0, 800, 750} - 使用初始化列表對結構體成員進行初始化

這種初始化方式稱為"聚合初始化",適用于簡單的結構體類型。C++11以后也可以使用統一初始化語法:

MAIN_PROPULSION_CAN::VoltageThresholds MAIN_PROPULSION_CAN::currentVoltageThresholds{0, 800, 750};

二、成員函數實現語法

類成員函數的實現需要包含類名限定符,如代碼中展示的閾值設置函數:

void MAIN_PROPULSION_CAN::setVoltageThresholds(const VoltageThresholds& thresholds) {currentVoltageThresholds = thresholds;
}

語法要點:

  1. 返回類型:void表示函數不返回值
  2. 函數名前的類限定:MAIN_PROPULSION_CAN::表明這是類的成員函數
  3. 參數:const VoltageThresholds& thresholds - 常量引用參數,避免拷貝開銷
  4. 函數體:簡單的賦值操作,將參數值賦給靜態成員變量

三、const引用參數的重要性

所有setter函數都使用了const引用參數:

void MAIN_PROPULSION_CAN::setTemperatureThresholds(const TemperatureThresholds& thresholds)

這樣設計的好處:

  1. 避免大對象拷貝帶來的性能開銷
  2. const保證函數內不會意外修改傳入的參數
  3. 引用傳遞比指針更安全,語法更簡潔

四、靜態成員變量的訪問

在成員函數內部,靜態成員變量可以直接訪問:

currentTemperatureThresholds = thresholds;

雖然靜態成員屬于類而非對象,但在類的成員函數中訪問時不需要類名限定。

五、良好的封裝實踐

這段代碼展示了良好的面向對象封裝原則:

  1. 數據成員設為private,防止外部直接修改
  2. 通過public的setter函數控制對內部狀態的修改
  3. 相關閾值以結構體形式組織,提高代碼可讀性
  4. 靜態成員集中管理全局配置

六、實際應用建議

在實際工程中,這種模式可以擴展為:

  1. 添加參數有效性檢查
  2. 增加線程安全保護(如mutex)
  3. 添加日志記錄閾值變更
  4. 實現觀察者模式通知相關組件閾值變化

這種結構體加成員函數的模式在硬件接口、配置管理等場景非常實用,既能保持代碼組織清晰,又能提供靈活的參數調整能力。


拓展:

深入了解一下 const TimingThresholds& thresholds 的用法。

1. 語法解析

  • const:表示這個引用指向的對象是常量,不能通過這個引用修改對象的內容。
  • TimingThresholds:這是一個結構體類型,表示一組時間相關的閾值。
  • &:表示這是一個引用,而不是一個副本。引用是一個別名,它指向實際的對象,而不是創建一個新的對象。
  • thresholds:這是引用的變量名,表示通過這個引用可以訪問實際的 TimingThresholds 對象。

2. 為什么使用引用

在C++中,引用(&)是一種非常有用的技術,它允許函數直接操作傳入的參數,而不是操作參數的副本。這有以下幾個優點:

  • 性能優化:如果傳遞的對象比較大(例如一個大的結構體或類),傳遞引用可以避免復制整個對象,從而節省時間和內存。
  • 直接修改:如果需要在函數內部修改傳入的對象,使用引用可以直接修改原始對象,而不是修改一個副本。

3. 為什么使用 const 引用

使用 const 引用可以確保函數不會修改傳入的對象。這有以下幾個優點:

  • 安全性:可以防止函數意外地修改傳入的對象,從而避免潛在的錯誤。
  • 兼容性:允許函數接受常量對象作為參數,而不僅僅是非常量對象。這使得函數更加通用,可以接受更廣泛的參數類型。

4. 示例代碼

假設我們有一個 TimingThresholds 結構體,定義如下:

struct TimingThresholds {int64_t outputTooFastThreshold;int64_t outputTooSlowThreshold;int64_t noOutputThreshold;int64_t feedbackTooFastThreshold;int64_t feedbackTooSlowThreshold;int64_t feedbackTimeoutThreshold;
};

現在,我們定義一個函數,它接受一個 const TimingThresholds& 參數:

void printThresholds(const TimingThresholds& thresholds) {std::cout << "Output too fast threshold: " << thresholds.outputTooFastThreshold << " ns" << std::endl;std::cout << "Output too slow threshold: " << thresholds.outputTooSlowThreshold << " ns" << std::endl;std::cout << "No output threshold: " << thresholds.noOutputThreshold << " ns" << std::endl;std::cout << "Feedback too fast threshold: " << thresholds.feedbackTooFastThreshold << " ns" << std::endl;std::cout << "Feedback too slow threshold: " << thresholds.feedbackTooSlowThreshold << " ns" << std::endl;std::cout << "Feedback timeout threshold: " << thresholds.feedbackTimeoutThreshold << " ns" << std::endl;
}

在這個函數中,thresholds 是一個對傳入的 TimingThresholds 對象的引用,但它是一個 const 引用,因此我們不能通過 thresholds 修改原始對象。

5. 調用函數

現在,我們創建一個 TimingThresholds 對象,并將其傳遞給 printThresholds 函數:

int main() {TimingThresholds thresholds = {200000, 80000, 120000, 400, 500, 5000};printThresholds(thresholds);return 0;
}

在這個例子中,thresholds 是一個 TimingThresholds 對象,我們將其傳遞給 printThresholds 函數。由于 printThresholds 函數接受一個 const TimingThresholds& 參數,因此它不會修改 thresholds 對象,同時避免了復制整個對象的開銷。

6. 總結

  • const TimingThresholds& thresholds 表示函數接受一個對 TimingThresholds 對象的常量引用。
  • 使用引用可以避免復制對象,提高性能。
  • 使用 const 引用可以確保函數不會修改傳入的對象,提高代碼的安全性和兼容性。
  • 這種用法在處理大型對象或需要保證函數不會修改參數時非常有用。

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

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

相關文章

買了新內存條插上bios識別,進入系統不可用,b450主板,內存插槽A1A2 可以點亮,B1B2不可以,A2B2不可以,B1B2還是不可以

提示&#xff1a;買了新內存條插上bios識別&#xff0c;進入系統不可用&#xff0c;b450主板&#xff0c;內存插槽A1A2 可以點亮&#xff0c;B1B2不可以&#xff0c;A2B2不可以 文章目錄 前言——環境一、第一種情況&#xff0c;開機不能點亮二、第二種情況, 總內存&#xff0c…

7.4.1_2B樹的插入刪除

B樹插入&#xff1a; 假如是m階B樹&#xff0c;插入關鍵字時都要滿足每個節點上的關鍵字個數最少為m/2向上取整-1關鍵字&#xff0c;最多有m-1個關鍵字&#xff0c;且每次插入的新元素一定是放在最底層的終端節點(因為如果不是放在終端節點&#xff0c;會導致該節點上可能有葉子…

Linux系統基本操作指令

Linux系統基本操作指令 文章目錄 Linux系統基本操作指令一、介紹二、基礎設置2.1 設置ubuntu與window的共享目錄2.2 ubuntu系統簡單介紹 三、Linux命令及工具介紹3.1 目錄管理命令(功能&#xff0c;格式&#xff0c;參數&#xff0c;系統參數)3.2 文件操作命令 四、網絡命令4.1…

系統思考VS心智模式

在這張圖片中&#xff0c;我們看到的是兩杯相同價格的咖啡&#xff0c;它們的價格顯示方式不同。一杯咖啡的原價和現價都寫得很大&#xff0c;而另一杯的價格則以較小的字體呈現。這種微妙的設計差異揭示了一個有趣的心理現象——心智模式。 人們在面對同樣的價格時&#xff0…

all()函數和any()函數

參考文獻 在if上使用.all和.any # 中心點未改變&#xff0c;說明達到穩態&#xff0c;結束遞歸if (self.points new_center).all():sum self.__sumdis(result)return result, self.points, sum

Maven:依賴管理就像樂高拼裝的藝術

目錄 &#x1f3d7;? 第一章&#xff1a;Maven是高級樂高玩家&#x1f50d; 依賴管理的基本單元 &#x1f9e9; 第二章&#xff1a;多模塊項目——樂高巨艦組裝術&#x1f31f; 為什么要拆分模塊&#xff1f;&#x1f6e0;? 父子POM配置示范 ?? 第三章&#xff1a;依賴沖突…

空間數據挖掘 期末復習

前言&#xff1a;此篇復習筆記結合了課程ppt和deepseek回答進行總結&#xff0c;如有謬誤懇請指正。 期末考例題 &#xff08;名詞解釋*10、簡答*6、論述*6&#xff09; 一、名詞解釋 數據挖掘 過擬合&#xff08;Overfitting&#xff09; Apriori算法 決策樹&#xff08;…

跳跳桿、彈跳桿、Poto stick:百年彈跳玩具的健康與使用分享(大模型改寫)

跳跳桿&#xff1a;百年彈跳神器的健康爭議與安全指南 &#xff08;用DeepSeek改寫前一篇文章&#xff0c;可惜沒有接廣告&#xff0c;否則植入一些鏈接多好&#xff09; &#x1f50d; 一、健康功效&#xff1a;驚喜與風險并存 爭議性健康主張 坊間流傳跳跳桿可能具備&…

WHAT - React Native 開發 App 從 0 到上線全流程周期

文章目錄 一、React Native App 開發流程總覽二、各階段詳細說明需求分析 & 產品規劃技術選型 & 方案確定項目初始化A. 使用 Expo&#xff08;推薦新手&#xff09;B. 使用 React Native CLI&#xff08;自由度更高&#xff09; UI 開發 功能開發&#xff08;主開發階…

Windows11 無法發現局域網內設備解決方法

臨時解決 發生問題絕大多數Windows11 24H2版本&#xff0c;該版本目前來看沒有永久解決方案 初步問題可以定位在FDResPub服務問題&#xff0c;重啟該服務可以短暫恢復&#xff0c;臨時解決方案就是重啟該服務&#xff0c;然后把網絡設備右鍵創建快捷方式 做成批處理文件 創建…

張 心理健康咨詢相關論文;AI心理咨詢數字孿生:個性化風格的突破

張 心理健康咨詢相關論文 EmoLLM:多模態情感理解與大型語言模型的結合 PsyDT:使用 LLM 構建具有個性化咨詢風格的心理咨詢師數字孿生 目前,大型語言模型 (LLM) 在心理咨詢領域取得了重大進展。然而,現有的心理健康 LLM 忽略了一個關鍵問題,即他們沒有考慮不同的心理咨…

通達信【千軍趨勢決策系統】幅圖指標

指標功能說明 本指標基于價格波動與趨勢轉折點,結合K線形態分析,提供多維度買賣信號,適用于股票、期貨等趨勢交易場景。 核心信號解讀 「橫掃千軍」 觸發條件:短期、中期、長期趨勢同時確認反轉向上。 用法:趨勢共振信號,提示較強多頭機會,可結合成交量驗證。 「出擊!…

大模型LoRA微調實踐

大模型LoRA微調實踐 準備工作 數據集&#xff1a;采用 GitHub 上的 Chinese-medical-dialogue-data 中文醫療對話數據集 Github地址如下&#xff1a; https://github.com/Toyhom/Chinese-medical-dialogue-data 微調模型&#xff1a; Qwen 1.5B模型&#xff08;Qwen2、2.5均…

跟著AI學習C#之項目實踐Day1

&#x1f9ed; 實戰項目&#xff1a;博客平臺系統 - Day1 &#x1f3d7;? 目標 創建新的 ASP.NET Core 項目添加 EF Core 和 Identity 支持實現用戶注冊、登錄功能運行并測試基本身份驗證流程 &#x1f5d2;? 任務清單 1. 創建新項目 打開 Visual Studio 或 Visual Studi…

Java面試復習指南:基礎、面向對象、Java 8新特性及并發編程

Java面試復習指南&#xff1a;基礎、面向對象、Java 8新特性、常用框架及并發編程 面試中&#xff0c;Java開發者常被問及多個核心技術點。本文從以下幾個方面幫助考生快速復習&#xff1a; Java基礎 概念解析&#xff1a;Java是一種面向對象的高級編程語言&#xff0c;具有…

微信小程序form表單手機號正則檢驗pattern失效

好奇怪啊&#xff0c;h5頁面校驗沒問題&#xff0c;在微信小程序模擬器以及真機運行都失效&#xff0c;排查半天&#xff0c;記錄一下 PS&#xff1a;身份證號校驗也沒問題&#xff0c;就手機號校驗有問題&#xff0c;奇奇怪怪的 之前的寫法&#xff08;在小程序上不生效&…

基于LQR的雙積分小車軌跡跟蹤控制系列(三)從連續到離散:雙積分小車狀態空間的數字實現

為什么要離散化&#xff1f; 以便在數字硬件和仿真程序中使用。 離散化的數學推導 連續狀態空間&#xff1a; 雙積分小車的簡化形式 由于雙積分小車的 A 矩陣結構簡單&#xff08;A0&#xff09;&#xff0c;矩陣指數可以化簡&#xff1a; Python實現&#xff08;示例代碼&am…

如何在服務器終端下載百度網盤數據

使用BaiduPCS-Go在終端實現遠程服務器對百度網盤數據的上傳與下載流程學習 BaiduPCS-Go可用于訪問和管理百度網盤文件資源的命令行客戶端下載百度網盤數據至服務器從服務器中上傳文件至百度網盤中BaiduPCS-Go可用于訪問和管理百度網盤文件資源的命令行客戶端 下載百度網盤數據…

消息隊列:基本知識

定義 隊列 Queue 是一種先進先出的數據結構&#xff0c;所以消費消息時也是按照順序來消費的 消息隊列看作是一個存放消息的容器&#xff0c;需要使用消息的時候&#xff0c;直接從容器中取出消息供自己使用即可 參與消息傳遞的雙方稱為 生產者 和 消費者 生產者負責發送消…

算法-動態規劃-鋼條切割問題

鋼條切割問題是一個經典的動態規劃問題&#xff0c;旨在通過切割鋼條獲得最大收益。以下是詳細解釋和解決方案&#xff1a; 問題描述 給定長度為 n 的鋼條和價格表 p&#xff0c;其中 p[i] 表示長度為 i 的鋼條的價格&#xff08;i 1, 2, ..., n&#xff09;。目標&#xff…