C++
的结构体(struct
)和 C
语言的结构体,在语法和能力上是 有区别的。虽然看起来都叫 struct
,但本质上:
✅ C++ 的
struct
是“功能全面的小号 class”,而
❗ C 的struct
只能用于数据聚合(不能包含方法)
✅ 一张表看区别:C vs C++ 中 struct 的对比
功能点 | C 中的 struct | C++ 中的 struct |
---|---|---|
成员变量 | ✅ 支持 | ✅ 支持 |
成员函数 | ❌ 不支持 | ✅ 支持(可以有构造函数、方法等) |
构造函数 / 析构函数 | ❌ 不支持 | ✅ 支持 |
默认访问权限 | 全部 public | 默认 public (而 class 默认是 private ) |
继承、多态、虚函数 | ❌ 不支持 | ✅ 支持(和 class 一样) |
作用 | 仅用于聚合数据 | 类一样用于建模、行为封装 |
🔍 举个对比例子
🔸 C 语言结构体
// C 中的结构体只能定义字段(属性)
struct Point {int x;int y;
};// 不能写构造函数或成员函数
使用时:
struct Point p;
p.x = 1;
p.y = 2;
🔸 C++ 中的结构体
struct Point {int x, y;// 构造函数Point(int x, int y) : x(x), y(y) {}// 成员函数void print() {std::cout << "(" << x << ", " << y << ")" << std::endl;}
};
使用:
Point p(3, 4);
p.print(); // 输出: (3, 4)
✅ C++ 中的 struct 就和 class 几乎没区别,只是默认权限是 public
。
✅ 总结区别重点
特性 | C struct | C++ struct |
---|---|---|
功能范围 | 仅变量 | 变量 + 构造函数 + 方法 + 继承 |
用途 | 数据结构 | 类功能完整,只是语法习惯不同 |
和 class 的差别 | N/A | 只有默认权限不同(struct: public,class: private) |
🚀 快速记忆法:
C 的 struct 就是 “装数据的盒子”
C++ 的 struct 是 “开了全部特权的 class”
🧠 用 C 风格 struct + 函数,模拟 C++ 类的面向对象
目标:我们做一个简单的「点(Point)」结构,能进行打印、平移操作。
✅ 1. C++ 面向对象写法(类/struct 封装 + 方法)
// C++ 实现:面向对象
#include <iostream>
using namespace std;struct Point {int x, y;// 构造函数Point(int x, int y) : x(x), y(y) {}// 打印函数void print() {cout << "Point(" << x << ", " << y << ")" << endl;}// 移动坐标void move(int dx, int dy) {x += dx;y += dy;}
};int main() {Point p(1, 2);p.print();p.move(3, 4);p.print();return 0;
}
✅ 2. C 语言模拟面向对象(结构体 + 外部函数)
// C 实现:函数 + struct 模拟面向对象
#include <stdio.h>// 结构体定义
typedef struct {int x;int y;
} Point;// 相当于“方法”的函数
void Point_init(Point* p, int x, int y) {p->x = x;p->y = y;
}void Point_print(const Point* p) {printf("Point(%d, %d)\n", p->x, p->y);
}void Point_move(Point* p, int dx, int dy) {p->x += dx;p->y += dy;
}int main() {Point p;Point_init(&p, 1, 2);Point_print(&p);Point_move(&p, 3, 4);Point_print(&p);return 0;
}
🔍 对比分析
特性 | C++ 类方式 | C 模拟方式 |
---|---|---|
构造函数 | Point(x, y) | Point_init(&p, x, y) |
成员方法调用 | p.move(1, 2) | Point_move(&p, 1, 2) |
封装性 | 内部函数和成员耦合 | 分离,手动管理 |
可读性 | ✅ 高(面向对象) | ❌ 函数名重复繁琐 |
灵活性 | ✅ 支持继承、多态 | ❌ 靠人为规范 |
✅ 总结一句话:
C 是手动“模拟”类的行为,C++ 是语言级支持类的机制
如果你用 C 写模块化代码,常常会这样“结构体 + 函数 + 前缀命名”,来模拟类的封装。
你问得非常好,这个问题属于 C语言底层知识点,经常在面试 & 源码分析中出现。