struct和class的核心区别在于默认访问权限:struct默认成员和继承均为public,class默认成员和继承均为private。这一差异使struct常用于数据聚合的POD类型,如Point、Color等轻量级结构,便于直接访问成员;而class更适用于封装复杂行为与状态的抽象对象,如Account、FileHandler,强调信息隐藏和接口控制。尽管二者在语法功能上完全等价,均可实现OOP全部特性,包括继承与多态,但使用class进行面向对象设计符合社区约定,能更好传达代码意图,避免因默认public带来的封装风险和理解歧义。因此,最佳实践是用struct表示简单数据结构,用class构建封装良好的抽象类型。

C++中
struct
class
struct
public
class
private
struct
public
class
private
在C++的世界里,
struct
class
struct
struct
class
对于
struct
立即学习“C++免费学习笔记(深入)”;
public
struct
public
struct
struct
class
public
对于
class
private
class
private
class
struct
class
private
这看起来只是一个小小的默认设置差异,但在编程实践中,它却深刻影响了我们如何选择使用它们。
struct
Point
Date
struct
struct Point {
int x; // 默认 public
int y; // 默认 public
};
// 使用
Point p;
p.x = 10; // 可以直接访问
p.y = 20;而
class
public
private
protected
class Account {
double balance; // 默认 private
public:
void deposit(double amount) { // 显式 public
balance += amount;
}
double getBalance() const { // 显式 public
return balance;
}
};
// 使用
Account acc;
// acc.balance = 100; // 错误,balance是private
acc.deposit(100); // 通过public接口访问
double currentBalance = acc.getBalance();这种默认行为的选择,实际上是C++设计者在平衡C语言的兼容性(
struct
class
C++同时保留
struct
class
从历史角度看,
struct
struct
struct
class
从语义角度看,这种区分是一种约定俗成的“最佳实践”:
struct
struct
Point
Date
Color
struct
public
public:
// 示例:一个简单的颜色结构
struct Color {
unsigned char r, g, b, a; // 默认 public,方便直接访问
};
// 示例:一个链表节点
struct Node {
int data;
Node* next; // 默认 public,方便链表操作
};class
class
FileManager
DbConnection
Button
// 示例:一个文件操作类
class FileHandler {
std::string filename;
std::fstream fileStream; // 默认 private,隐藏文件流细节
public:
FileHandler(const std::string& name) : filename(name) { /* 打开文件 */ }
~FileHandler() { /* 关闭文件 */ }
bool writeLine(const std::string& line) { /* 写入逻辑 */ return true; }
std::string readLine() { /* 读取逻辑 */ return ""; }
};这种约定并非强制,但它提供了一种视觉线索,让阅读代码的人能更快地理解作者的意图。看到
struct
class
在继承和多态的机制层面,
struct
class
struct
class
struct
public
class
private
这意味着如果你写:
struct BaseStruct { int x; };
struct DerivedStruct : BaseStruct { int y; }; // 默认 public 继承这里的
DerivedStruct
public
BaseStruct
而如果你写:
class BaseClass { int x; };
class DerivedClass : BaseClass { int y; }; // 默认 private 继承这里的
DerivedClass
private
BaseClass
这个默认差异的影响在于,
private
public
protected
private
public
然而,请注意,这仅仅是默认行为。你完全可以通过显式指定继承方式来覆盖这些默认值:
// struct 也可以 private 继承
struct DerivedStructPrivate : private BaseStruct { /* ... */ };
// class 也可以 public 继承
class DerivedClassPublic : public BaseClass { /* ... */ };所以,在实现多态时,无论你使用的是
struct
class
public
struct Shape {
virtual void draw() const = 0; // 虚函数
virtual ~Shape() = default;
};
class Circle : public Shape { // public 继承,实现多态
public:
void draw() const override {
// 绘制圆形
}
};
class Rectangle : public Shape { // public 继承,实现多态
public:
void draw() const override {
// 绘制矩形
}
};
// 使用多态
std::vector<Shape*> shapes;
shapes.push_back(new Circle());
shapes.push_back(new Rectangle());
for (const auto& s : shapes) {
s->draw(); // 调用各自的 draw()
}
// 清理内存
for (const auto& s : shapes) {
delete s;
}在这个例子中,
Shape
struct
class
Circle
Rectangle
public
struct
class
从纯粹的技术能力上讲,将
struct
struct
class
struct
然而,尽管技术上可行,但在实际的工程实践和代码风格上,这样做可能会带来一些潜在的风格问题和误解:
违背社区约定和语义期望: 这是最主要的问题。如前所述,C++社区普遍将
struct
class
struct
struct
// 示例:一个可能引起误解的 struct
struct DatabaseConnection { // 看起来像数据,但可能内部有复杂逻辑
std::string connectionString;
void connect() { /* 复杂的连接逻辑 */ }
void disconnect() { /* 复杂的断开逻辑 */ }
// ... 还有很多 private 成员和方法
private:
Socket socket;
// ...
};这段代码虽然能跑,但
DatabaseConnection
struct
默认public
struct
private:
protected:
class
private
class
private
struct MyEncapsulatedObject {
public: // 如果不写,成员默认就是 public
void doSomethingPublic() { /* ... */ }
private: // 必须显式写 private
int internalState;
void doSomethingInternal() { /* ... */ }
};相比之下,使用
class
class MyEncapsulatedObject {
private: // 默认 private,无需显式写
int internalState;
void doSomethingInternal() { /* ... */ }
public:
void doSomethingPublic() { /* ... */ }
};对新手或跨团队协作的挑战: 对于C++新手或者在大型团队中协作时,遵循这些约定可以降低沟通成本。如果团队中有人滥用
struct
不必要的精神负担: 开发者在阅读或编写代码时,需要额外地去判断一个
struct
struct
class
总结来说,虽然技术上可行,但为了代码的清晰度、可读性、维护性以及与C++社区的普遍约定保持一致,强烈建议将class
struct
以上就是C++的struct和class在语法和默认访问权限上有何根本区别的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号