博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

C++ 中 struct 与 class 的用法与区别

Posted on 2025-11-20 22:06  steve.z  阅读(0)  评论(0)    收藏  举报

C++ 中 structclass 的用法与区别

1. 概述

在 C++ 中,structclass 都可以用来定义用户自定义类型(User-Defined Types)。
二者在语法能力上几乎完全相同,都可以:

  • 定义成员变量
  • 定义成员函数
  • 构造函数 / 析构函数
  • 访问修饰符(public / private / protected)
  • 继承、多态
  • 模板化

唯一真正的语法差异只有两点:默认访问权限与默认继承方式不同。


2. struct 与 class 的唯二语法差异

2.1 默认成员访问权限不同

类型 默认成员权限
struct public
class private

示例:

struct A {
    int x;   // 默认 public
};

class B {
    int x;   // 默认 private
};

2.2 默认继承方式不同

继承类型 使用 struct 使用 class
默认继承方式 public private

示例:

struct Base {};
struct Derived1 : Base {};   // 默认 public 继承

class Base2 {};
class Derived2 : Base2 {};   // 默认 private 继承

3. struct 与 class 其他方面完全一致

以下方面 struct 与 class 完全没有语法区别

  • ✔ 可以定义成员函数
  • ✔ 可以定义构造/析构函数
  • ✔ 可以继承 / 多态
  • ✔ 可以模板化
  • ✔ 可以有 private/protected/public
  • ✔ 都可以作为面向对象编程的基本构件
  • ✔ 都可以用于封装数据与行为

示例:struct 一样可以有复杂行为:

struct Foo {
    Foo() {}
    void run() {}
private:
    int data;
};

而 class 一样可以是纯数据载体:

class Point {
public:
    int x;
    int y;
};

4. 使用上的习惯(行业广泛遵循)

虽然语法等价,但开发中通常遵循以下约定:


4.1 struct 用于“数据结构”

特点:

  • 成员默认 public,更适合公开的数据载体

  • 更倾向于作为 POD(Plain Old Data)

  • 常用于:

    • 函数返回结构体
    • 配置参数
    • 轻量数据结构

示例:

struct Vec3 {
    float x, y, z;
};

4.2 class 用于“面向对象的封装”

特点:

  • 成员多数为 private

  • 强调封装性与行为逻辑

  • 常用于:

    • 对象抽象(Student、Car 等)
    • 封装复杂行为
    • 多态体系

示例:

class Student {
public:
    void study();
private:
    std::string name;
    int age;
};

5. 使用注意事项

5.1 注意默认继承方式导致的 BUG

class Base {};
class Derived : Base {}; // 默认 private,会导致基类成员不可访问

若你期望 public 继承,一定要写:

class Derived : public Base {};

5.2 使用 struct + private 容易造成误解

虽然合法,但不符合常规阅读习惯:

struct Foo {
private:
    int x;  // 不推荐:struct+private 容易误导读者
};

5.3 struct 并不等于 POD(Plain Old Data)

POD 是否成立取决于类型特征,与是否为 struct/class 无关。


5.4 C 的 struct ≠ C++ 的 struct

C 语言的 struct:

  • 不能有成员函数
  • 不能有访问修饰符
  • 不能继承

C++ 中 struct 和 class 完全等价,只是默认权限不同。


6. 示例代码总结

struct(适合“数据结构”)

struct PersonInfo {
    std::string name;
    int age;
    double height;
};

class(适合“封装对象”)

class Person {
public:
    Person(std::string name, int age) : name(name), age(age) {}
    void introduce();
private:
    std::string name;
    int age;
};

7. 总结(面试高频答案)

C++ 中 struct 与 class 的唯二区别是:

  1. 默认成员权限不同:struct 默认 public,class 默认 private。
  2. 默认继承方式不同:struct 默认 public 继承,class 默认 private 继承。

除此之外二者完全一致。
struct 多用于数据载体,class 多用于封装对象行为,这是编码习惯而非语法规定。