C++的struct里面可以放函数,讨论一下C++和C关于struct的使用区别
我们来看一个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
并无本质区别,因此可以包含函数。 - 构造函数让对象在创建时自动执行初始化。
- 把函数放在结构体里可以让数据和操作绑定,更易用。