C++中struct和class有什么区别?
参考回答
在C++中,struct 和 class 的主要区别是默认的访问控制权限:
1. struct:默认的成员访问权限是 public。
2. class:默认的成员访问权限是 private。
除此之外,struct 和 class 本质上是一样的,都可以包含成员变量、成员函数、构造函数、继承等特性。它们的区别更多在于语义习惯上:
– struct 通常用于简单的数据结构。
– class 通常用于定义复杂的对象和行为。
示例:
struct StructExample {
int a; // 默认是 public
};
class ClassExample {
int a; // 默认是 private
};
详细讲解与拓展
1. 访问控制区别
默认权限是 struct 和 class 的主要区别:
– struct 默认访问权限为 public,所以 struct 更适合用来定义简单的数据结构(类似于C语言中的结构体)。
– class 默认访问权限为 private,适合用来定义封装性强的类。
示例:
struct StructExample {
int a; // 默认 public
void display() {
cout << a << endl; // public 方法
}
};
class ClassExample {
int a; // 默认 private
public:
void setA(int value) {
a = value;
}
void display() {
cout << a << endl;
}
};
int main() {
StructExample s;
s.a = 10; // 直接访问 public 成员
s.display();
ClassExample c;
// c.a = 10; // 错误,a 是 private
c.setA(10); // 通过 public 方法设置值
c.display();
return 0;
}
2. 语义习惯区别
在实际编程中,struct 和 class 的使用有所约定:
– struct:多用于简单的数据结构,不需要封装复杂行为。例如,描述二维坐标点:
“`cpp
struct Point {
int x;
int y;
};
“`
– **`class`**:用于复杂的对象建模,通常包含私有属性和公有接口。例如:
“`cpp
class Rectangle {
private:
int width, height;
public:
Rectangle(int w, int h) : width(w), height(h) {}
int area() { return width * height; }
};
“`
<hr />
<h4>3. C++标准中两者的本质</h4>
从C++语言设计上看,<code>struct</code> 和 <code>class</code> 是等价的,除了访问控制默认值不同以外:
– <strong>继承</strong>:两者都支持继承,且可以指定继承的访问权限。<br />
“`cpp
struct Base {
int x;
};
struct Derived : public Base { // struct 默认 public 继承
int y;
};
class DerivedClass : private Base { // class 默认 private 继承
int z;
};
“`
– **功能一致**:两者都可以有构造函数、析构函数、静态成员函数、友元函数等。
4. struct 和 class 的继承默认行为
在继承中,struct 和 class 的默认继承权限不同:
– struct 默认是 public 继承。
– class 默认是 private 继承。
示例:
struct Base {
int x;
};
struct DerivedStruct : Base { // 默认 public 继承
void print() { cout << x << endl; }
};
class DerivedClass : Base { // 默认 private 继承
void print() {
// cout << x << endl; // 错误,x 是 private
}
};
5. C 风格兼容性
struct 是从 C 语言继承下来的,兼容 C 风格的结构体定义。而 class 是 C++ 特有的概念,设计用于面向对象编程。
总结
- 主要区别:
struct默认是 public,class默认是 private。 - 实际使用:
- 使用
struct定义简单的数据结构。 - 使用
class构建复杂的对象模型。
- 使用
- 两者在功能上是等价的,支持构造函数、继承、多态等特性。选择使用哪个更多是为了语义上的清晰和代码风格的统一。