我們來看一個C++代碼下面的struct結構體:
struct UserValue {float lx;float ly;float rx;float ry;float L2;// 【構造函數】UserValue() {setZero();}// 【成員函數】void setZero() {lx = 0;ly = 0;rx = 0;ry = 0;L2 = 0;}
};
在這篇文章中,我們將來詳細解釋一下為什么 UserValue
結構體里面還能放函數,以及這是怎么工作的。
1. C++ 結構體和類的關系
這一個代碼是 C++ 語法,不是傳統 C 語言。
- 在 C 語言里,
struct
只能放變量(成員),不能放函數,因為 C 語言不支持面向對象。 - 在 C++ 里,
struct
本質上和class
是一樣的,唯一的區別是:struct
默認的成員訪問權限是 publicclass
默認的成員訪問權限是 private
- 因此,C++ 的
struct
同樣可以包含:- 成員變量(數據)
- 成員函數(方法)
- 構造函數 / 析構函數
- 運算符重載
- 靜態成員
- 甚至還能有繼承、模板等特性
所以,在 C++ 里,struct
可以寫函數并不奇怪。
2. 代碼分析
struct UserValue {float lx;float ly;float rx;float ry;float L2;// 【構造函數】UserValue() {setZero();}// 【成員函數】void setZero() {lx = 0;ly = 0;rx = 0;ry = 0;L2 = 0;}
};
-
UserValue()
→ 構造函數
當你創建一個UserValue
對象時,這個函數會自動執行,這里是調用setZero()
來把所有變量置為 0。 -
setZero()
→ 普通成員函數
你可以在對象創建后手動調用它,比如:UserValue uv; uv.setZero(); // 手動清零
3. 運行過程舉例
int main() {UserValue uv; // 會自動調用 UserValue() 構造函數// 構造函數里調用 setZero() -> 所有成員 = 0
}
過程順序:
UserValue uv;
觸發構造函數UserValue()
- 構造函數內部調用
setZero()
setZero()
把lx, ly, rx, ry, L2
全部清零
4. 為什么把函數放在結構體里
這樣做的好處是 數據和操作綁定在一起,符合面向對象(OOP)思想:
- 數據 (
lx
,ly
,rx
,ry
,L2
) - 操作(
setZero
、構造函數)
代碼更 模塊化,方便使用和維護。
? 總結
- 在 C++ 里,
struct
與class
并無本質區別,因此可以包含函數。 - 構造函數讓對象在創建時自動執行初始化。
- 把函數放在結構體里可以讓數據和操作綁定,更易用。