在 C++ 中,结构体(struct
)与类(class
)在功能上非常相似,实际上他们之间的主要区别在于默认的访问权限和继承方式。下面详细解释这两种类型的区别:
结构体与类最大的不同就在于访问权限
默认访问权限
- 结构体 (
struct
):默认的成员访问权限是公开的(public
)。这意味着,除非显式地指定访问权限,结构体的所有成员(包括数据和函数)默认都是可以从结构体外部直接访问的。 - 类 (
class
):默认的成员访问权限是私有的(private
)。这表示,除非你显式地将类成员声明为公开或受保护的,否则这些成员无法从类外部直接访问。
默认继承方式
- 结构体 (
struct
):默认继承方式是公开的(public
)。如果你从一个结构体派生出一个新的结构体,并且没有显式指定继承类型(如public
,protected
,private
),则默认使用公开继承。 - 类 (
class
):默认继承方式是私有的(private
)。如果你从一个类派生出一个新的类而没有指定继承方式,则默认使用私有继承。
语法和使用
尽管存在上述差异,结构体和类在 C++ 中都可以包含数据成员和函数成员(包括构造函数、析构函数、成员函数等),并且都可以使用继承和多态。这意味着你可以使用结构体和类来实现相同的面向对象编程技术。
实用考虑
- 结构体:由于其默认的公开性,结构体通常用于需要打包数据的简单数据结构,不涉及复杂的行为(即方法较少或不需要封装的场合),例如纯数据结构(Plain Old Data, POD)。
- 类:类通常用于需要封装和复杂行为管理的场合,比如在实现真正的面向对象程序时。类的私有访问权限能够强制实施更好的封装,保护数据和实现细节不被外部访问。
示例代码
下面是一个展示两者用法的简单示例:
#include <iostream>
struct MyStruct {
int x; // 默认公开
void display() const { // 默认公开
std::cout << "Struct x: " << x << std::endl;
}
};
class MyClass {
private:
int y; // 默认私有
public:
MyClass(int val) : y(val) {} // 公开的构造函数
void display() const { // 公开的成员函数
std::cout << "Class y: " << y << std::endl;
}
};
int main() {
MyStruct s;
s.x = 10;
s.display();
MyClass c(20);
c.display();
return 0;
}
在这个示例中,MyStruct
和 MyClass
都有一个数据成员和一个显示该数据的函数。你可以看到,结构体成员默认是公开的,而类成员默认是私有的,只有显式声明为公开的成员才能从外部访问。这反映了两者在默认访问权限上的主要区别。