31.结构体和类的区别

31.面向对象关联知识点-结构体和类的区别


31.1 知识点

结构体和类的区别

struct TestS
{
    int i = 10;
};

struct TestSSon : TestS
{
};

class TestC
{
public:
    int i = 10;
};

class TestCSon : public TestC
{
};
  • C++ 中的结构体 (struct) 和类 (class) 几乎是一样的

  • 唯一的区别在于默认访问权限:

    • 类的默认访问权限是 private(私有)
    • 结构体的默认访问权限是 public(公共)
TestS s;
cout << s.i << endl;        // 10

TestC c;
cout << c.i << endl;        // 10  (需要加 public 才能访问)

TestCSon c2;
cout << c2.i << endl;       // 10  (需要继承时写成 `public TestC` 才能访问,默认是 `private TestC`)

TestSSon s2;
cout << s2.i << endl;       // 10
  • 除此之外,结构体和类在功能上完全相同
  • 我们目前学习的所有面向对象相关知识都可以同样应用到结构体上

开发时如何选择

  • 虽然结构体和类在 C++ 中几乎等价

  • 但在实际开发中有约定俗成的规则:

    • 仅包含数据的简单数据结构(例如位置信息、坐标等),推荐使用结构体
    • 更符合面向对象思想、需要封装行为和状态的类型,推荐使用类

既然类似,为何保留

  • C++ 语言是在 C 的基础上设计的
  • 结构体是 C 语言中的核心概念
  • C++ 的作者 Bjarne Stroustrup 设计 C++ 时,希望在保留 C 向下兼容的同时,引入面向对象能力
  • 因此没有废弃结构体,而是扩展它,让它也能具备“类”的特性
  • 这样可以保证老的 C 代码无需修改即可在 C++ 中继续使用,并且引入新特性不会破坏兼容性

31.2 知识点代码

Lesson31_面向对象关联知识点_结构体和类的区别.cpp

#include <iostream>
using namespace std;
struct TestS
{
    int i = 10;
};

struct TestSSon : TestS
{

};

class TestC
{
public:
    int i = 10;
};

class TestCSon : public TestC
{

};
int main()
{
    #pragma region 知识点一 结构体和类的区别

    //C++中的结构体(struct)和类(class)几乎是一样的
    //唯一的区别就是默认的访问权限不同
    // 
    //1.类的默认访问权限是private私有的
    //	结构体的默认访问权限是public公共的
    TestS s;
    cout << s.i << endl;//10
    TestC c;
    cout << c.i << endl;//10 要加才能public访问

    //2.类继承时,默认继承权限是私有的
    //	结构体继承时,默认继承权限是公共的
    TestCSon c2;
    cout << c2.i << endl;//10 要显示: public TestC才能访问 默认是: private TestC
    TestSSon s2;
    cout << s2.i << endl;//10

    //除此之外结构体和类功能上完全相同
    //我们目前学习的所有面向对象相关知识都可以用在结构体上

    #pragma endregion

    #pragma region 知识点二 开发时如何选择

    //虽然在C++中结构体和类几乎一样
    //但是我们在实际开发时还是会有约定俗成的规则
    //1.只包含数据的简单数据结构,推荐使用 结构体
    //  表示 位置 坐标 等等 是数据结合的这种数据结构体 我们就建议使用结构体
    // 
    //2.更符合面向对象思想的类型,推荐使用 类
    //	比如和现实中一样的对象的概念 我们都可以使用类

    #pragma endregion

    #pragma region 知识点三 既然类似,为何保留
    //C++语言是基于C语言设计的
    //结构体是C语言中的内容
    //C++作者 本贾尼·斯特劳斯特卢普(Bjarne Stroustrup)在设计C++时
    //他的目标是 在保留C的基础上,加上面向对象 的能力
    //因此他们选择不废弃结构体,而是拓展它,让它可以做 “类” 的事情
    //这样做的好处是,可以向下兼容,老的C代码可以在C++中使用
    #pragma endregion

}

31.3 练习题

在 C++ 中,struct 和 class 的主要区别是什么?

正确答案:C(默认访问权限不同)

解析:

  • A. struct 不支持成员函数,class 支持 —— 错误。C++ 中 structclass 都可以包含成员变量、成员函数、构造函数、析构函数、甚至虚函数。
  • B. class 不支持继承,struct 支持 —— 错误。classstruct 都支持继承,且继承方式语法相同。
  • C. 默认访问权限不同 —— 正确。在 C++ 中,struct 的成员默认是 public 的,而 class 的成员默认是 private 的。这是它们之间唯一的语法差异。
  • D. struct 的功能更强大 —— 错误。两者功能等价,无强弱之分,选择哪一个只是语义风格问题。

哪种情况更推荐使用 struct?

正确答案:B(创建一个只包含 x 和 y 坐标的 Vector2 类型)

解析:

  • A. 创建一个带封装逻辑的“玩家”类 —— 错误。这类具有复杂逻辑的实体通常使用 class 表达封装语义更明确。
  • B. 创建一个只包含 x 和 y 坐标的 Vector2 类型 —— 正确。结构体(struct)更适用于这种只包含公共数据、无需封装的简单数据聚合类型。
  • C. 需要实现虚函数表的复杂多态结构 —— 错误。多态、继承等高级特性推荐使用 class,以强调其面向对象本质。
  • D. 实现数据隐藏和访问控制的系统类 —— 错误。class 具备更强语义表达,更适用于数据封装、控制访问权限等需求。

以下哪个类定义是“默认私有继承”?

正确答案:Aclass A : B {}

解析:

  • A. class A : B {} —— 正确。当使用 class 进行继承而未指明继承类型时,默认为 private 继承。
  • B. struct A : B {} —— 错误。使用 struct 继承时默认是 public 继承。
  • C. class A : public B {} —— 错误。这是明确的 public 继承,不是默认私有。
  • D. struct A : private B {} —— 错误。虽然结果是私有继承,但是显式指定的,不是默认行为。

使用 class 的代码功能一定比使用 struct 强?

参考答案:不是。

解析:
这种理解是错误的。C++ 中 classstruct 在功能上完全等价,它们都支持:

  • 成员变量和函数
  • 构造函数、析构函数
  • 继承、多态、虚函数等 OOP 特性

唯一差异是默认访问权限:

  • class 默认成员是 private
  • struct 默认成员是 public

总结: 是否使用 classstruct 是语义和风格问题,而不是能力或功能差异。例如:

  • 简单的数据结构(如向量、坐标)用 struct 更直观
  • 有封装行为、复杂逻辑的类型使用 class 更合适


转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 785293209@qq.com

×

喜欢就点赞,疼爱就打赏