在C++中,class 和 struct 都是用户自定义类型的机制,它们在功能上几乎完全相同,最大的区别在于默认的访问权限和默认的继承权限。理解这一点对于掌握封装在两者中的应用至关重要。
核心区别:默认访问权限
这是 class 和 struct 最根本的区别:
class:
默认访问权限是 private。
类内未明确指定访问修饰符的成员(变量和函数)默认为 private。
这天然地支持封装,因为数据和实现细节被隐藏起来。
struct:
默认访问权限是 public。
结构体内未明确指定访问修饰符的成员默认为 public。
这使得 struct 更像是一个简单的数据容器。
封装在 class 中的应用
class 是实现封装的首选和标准方式。
设计意图:class 的设计初衷就是面向对象编程,强调数据隐藏和行为抽象。
默认 private:成员变量通常声明为 private,外部无法直接访问。
提供公共接口:通过 public 的成员函数(如 getter/setter、操作方法)来安全地访问和修改内部数据。
示例:
class Person {
// 默认就是 private
std::string name; // 外部无法直接访问
int age;
public:
void setName(const std::string& n) {
if (!n.empty()) name = n; // 可以加入验证逻辑
}
std::string getName() const { return name; }
// ... 其他公共方法
};
// 使用
Person p;
// p.name = "Alice"; // 错误!name 是 private
p.setName("Alice"); // 正确,通过公共接口
封装在 struct 中的应用
虽然 struct 默认是 public,但这并不意味着它不能实现封装。你完全可以像使用 class 一样,在 struct 中使用 private 和 public 关键字。
可以实现封装:
struct BankAccount {
// 显式使用 private
private:
std::string owner;
double balance;
public:
BankAccount(const std::string& o, double b) : owner(o), balance(b) {}
void deposit(double amount) { /* 带验证的逻辑 */ }
double getBalance() const { return balance; }
};
在这个例子中,BankAccount 结构体实现了完全的封装,与使用 class 定义没有区别。
传统用途:struct 通常用于表示纯数据结构(Plain Old Data, POD),即只包含数据成员,不包含复杂的行为或需要隐藏的状态。
struct Point {
double x; // 默认 public
double y; // 默认 public
};
// 使用
Point p;
p.x = 1.0; // 直接访问,简单直接
1003

被折叠的 条评论
为什么被折叠?



