1. 默认访问控制
这是struct
和class
最显著的区别:
-
struct
:-
默认的成员访问权限是
public
。 -
默认的继承方式是
public
继承。
-
-
class
:-
默认的成员访问权限是
private
。 -
默认的继承方式是
private
继承。
-
示例:默认访问控制
cpp
struct MyStruct {
int x; // 默认是 public
};
class MyClass {
int x; // 默认是 private
};
int main() {
MyStruct s;
s.x = 10; // 合法,x 是 public
MyClass c;
// c.x = 10; // 错误,x 是 private
return 0;
}
2. 设计意图
-
struct
:-
通常用于表示简单的数据结构,尤其是当数据成员需要直接访问时。
-
常用于与C语言兼容的场景,或者不需要复杂封装的情况。
-
-
class
:-
通常用于表示更复杂的对象,强调封装和数据隐藏。
-
适合实现面向对象的设计模式(如继承、多态等)。
-
3. 继承的默认访问控制
-
struct
:-
默认继承方式是
public
继承。 -
例如:
struct Derived : Base {}
,等价于struct Derived : public Base {}
。
-
-
class
:-
默认继承方式是
private
继承。 -
例如:
class Derived : Base {}
,等价于class Derived : private Base {}
。
-
示例:继承的默认访问控制
cpp
struct Base {
int x;
};
struct DerivedStruct : Base { // 默认是 public 继承
void print() { std::cout << x; }
};
class DerivedClass : Base { // 默认是 private 继承
void print() {
// std::cout << x; // 错误,x 在 Base 中是 private(因为默认是 private 继承)
}
};
4. 使用场景
-
struct
:-
适合用于简单的数据聚合,例如点(
Point
)、矩形(Rectangle
)等。 -
适合与C语言代码交互时使用。
-
-
class
:-
适合用于复杂的对象模型,例如学生(
Student
)、车辆(Vehicle
)等。 -
适合需要封装和数据隐藏的场景。
-
5. 代码示例对比
以下是一个struct
和class
的对比示例:
使用struct
cpp
#include <iostream>
#include <string>
struct Person {
std::string name; // 默认是 public
int age; // 默认是 public
void printInfo() {
std::cout << "Name: " << name << ", Age: " << age << std::endl;
}
};
int main() {
Person p;
p.name = "Alice"; // 可以直接访问
p.age = 25; // 可以直接访问
p.printInfo(); // 输出: Name: Alice, Age: 25
return 0;
}
使用class
cpp
#include <iostream>
#include <string>
class Person {
std::string name; // 默认是 private
int age; // 默认是 private
public:
void setName(const std::string& n) { name = n; }
void setAge(int a) { age = a; }
void printInfo() {
std::cout << "Name: " << name << ", Age: " << age << std::endl;
}
};
int main() {
Person p;
p.setName("Alice"); // 必须通过公共方法访问
p.setAge(25); // 必须通过公共方法访问
p.printInfo(); // 输出: Name: Alice, Age: 25
return 0;
}
6. 总结对比表
特性 | struct |
class |
---|---|---|
默认访问控制 | 成员默认是public |
成员默认是private |
默认继承方式 | 默认是public 继承 |
默认是private 继承 |
设计意图 | 简单数据聚合,与C兼容 | 复杂对象模型,强调封装 |
常见用途 | 点、矩形、配置参数等 | 学生、车辆、银行账户等 |
7. 选择struct
还是class
?
-
如果需要直接访问数据成员,或者与C语言兼容,优先使用
struct
。 -
如果需要封装和数据隐藏,或者实现复杂的面向对象设计,优先使用
class
。
在实际开发中,struct
和class
的选择更多是基于设计意图和代码风格,而不是严格的规则。