类和结构体的区别

类和结构体是面向对象编程中两种重要的数据结构,它们有以下主要区别:

1. 默认访问控制

  • :成员默认为私有(private)
  • 结构体:成员默认为公开(public)

2. 内存分配位置

  • :通常在堆(heap)上分配内存
  • 结构体:通常在栈(stack)上分配内存

3. 继承特性

  • :可以实现继承、多态等完整的面向对象特性
  • 结构体:在许多语言中不支持继承或有限支持继承

4. 语言差异

不同编程语言对类和结构体的区别处理不同:

C++

1
2
3
4
5
6
7
8
9
10
11
struct Point {
int x; // 默认public
int y;
};

class Point {
int x; // 默认private
int y;
public:
void setPoint(int a, int b) { x = a; y = b; }
};

C#

1
2
3
4
5
6
7
8
9
10
11
12
13
// 值类型,存储在栈上
struct Point
{
public int X;
public int Y;
}

// 引用类型,存储在堆上
class Point
{
public int X;
public int Y;
}

Swift

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
struct Point {
var x: Int
var y: Int

mutating func moveBy(x deltaX: Int, y deltaY: Int) {
x += deltaX
y += deltaY
}
}

class PointClass {
var x: Int
var y: Int

init(x: Int, y: Int) {
self.x = x
self.y = y
}

func moveBy(x deltaX: Int, y deltaY: Int) {
x += deltaX
y += deltaY
}
}

5. 复制行为

  • :引用语义(reference semantics),复制时是浅拷贝
  • 结构体:值语义(value semantics),复制时是深拷贝

6. 用途区别

  • :适合表示复杂的、有身份特性的对象,有状态变化
  • 结构体:适合表示简单的、无状态或状态简单的数据结构

7. 性能差异

  • :操作可能涉及引用计数、虚函数表等额外开销
  • 结构体:直接操作内存,性能通常更高

根据应用场景和性能需求,合理选择类或结构体可以显著提高程序的效率和可维护性。