【C++进阶基石】struct与class:它们到底有什么区别?(答案只有一个词!)
当你开始学习C++的面向对象编程(OOP)时,struct和class是两个你无法绕过的关键字。它们都允许你将不同的数据类型打包在一起,创建一个自定义的“复合类型”。那么,它们之间到底有什么区别?很多人会说:“struct是C的,class是C++的”,或者“struct只能放数据,class可以放函数”。这些说法都不完全准确!
在C++中,struct和class的真正区别,归根结底只有一个词:默认访问权限 (Default Access Specifier)。
一、唯一的本质区别:public vs private
-
struct: 其成员的默认访问权限是 public(公开的)。
这意味着,如果你不明确指定,struct里的所有成员变量和成员函数,在外部都可以被直接访问。 -
class: 其成员的默认访问权限是 private(私有的)。
这意味着,如果你不明确指定,class里的所有成员变量和成员函数,在外部都是不可访问的,它们被保护了起来。
代码胜于雄辩:
#include <iostream>
struct PlayerStruct {
// 未指定,默认为 public
std::string name;
int score;
};
class PlayerClass {
// 未指定,默认为 private
std::string name;
int score;
};
int main() {
PlayerStruct p_struct;
p_struct.name = "StructPlayer"; // OK! 因为name是public
p_struct.score = 100; // OK! 因为score是public
std::cout << "Struct Player: " << p_struct.name << std::endl;
PlayerClass p_class;
// p_class.name = "ClassPlayer"; // 编译错误!因为name是private,无法从外部访问
// p_class.score = 100; // 编译错误!因为score是private
return 0;
}
上面的代码中,访问p_struct的成员完全没问题,但访问p_class的成员则会导致编译失败。这就是它们唯一的、本质的区别。
二、在C++中,struct能做的,class都能做,反之亦然
除了默认权限,struct和class在功能上几乎完全等价。
-
struct可以有成员函数吗?可以!
-
struct可以有构造函数和析构函数吗?可以!
-
struct可以使用继承吗?可以!
你完全可以写一个功能上和class一模一样的struct,只要手动把所有成员都声明为private或public即可。
class MyClass {
public: // 手动设为public
int data;
};
struct MyStruct {
// 默认就是public
int data;
};
// 上面两者在使用上完全一样
三、编程约定:我们应该如何选择?
既然功能一样,那我们平时该如何选择呢?在C++社区,有一个广泛遵循的编程约定,这比语法区别更重要:
-
使用 struct:
当你只是想把一堆纯数据(Plain Old Data, POD)打包在一起,而且这些数据不需要复杂的逻辑来保护时,就用struct。它强调的是数据的集合。
例子:struct Point { double x; double y; double z; }; struct RGBColor { int r, g, b; }; -
使用 class:
当你创建的对象不仅有数据,还需要有行为(成员函数),并且需要通过封装(private)来保护其内部状态不被随意修改时,就用class。它强调的是数据与操作的统一和信息隐藏。这是面向对象编程的核心思想。
例子:class BankAccount { private: double balance; // 余额是私有的,不能随便改 public: void deposit(double amount); // 只能通过公共方法存款 bool withdraw(double amount); // 只能通过公共方法取款 };
总结
struct和class在C++中的唯一技术区别是默认访问权限。但更重要的是它们在设计思想上的约定:用struct来表示简单的数据集合,用class来构建需要封装和复杂行为的对象。遵循这个约定,能让你的代码意图更清晰,也更专业!👍
更多推荐



所有评论(0)