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++ 中
struct
和class
都可以包含成员变量、成员函数、构造函数、析构函数、甚至虚函数。 - B. class 不支持继承,struct 支持 —— 错误。
class
和struct
都支持继承,且继承方式语法相同。 - C. 默认访问权限不同 —— 正确。在 C++ 中,
struct
的成员默认是 public 的,而class
的成员默认是 private 的。这是它们之间唯一的语法差异。 - D. struct 的功能更强大 —— 错误。两者功能等价,无强弱之分,选择哪一个只是语义风格问题。
哪种情况更推荐使用 struct?
正确答案:B(创建一个只包含 x 和 y 坐标的 Vector2 类型)
解析:
- A. 创建一个带封装逻辑的“玩家”类 —— 错误。这类具有复杂逻辑的实体通常使用
class
表达封装语义更明确。 - B. 创建一个只包含 x 和 y 坐标的 Vector2 类型 —— 正确。结构体(
struct
)更适用于这种只包含公共数据、无需封装的简单数据聚合类型。 - C. 需要实现虚函数表的复杂多态结构 —— 错误。多态、继承等高级特性推荐使用
class
,以强调其面向对象本质。 - D. 实现数据隐藏和访问控制的系统类 —— 错误。
class
具备更强语义表达,更适用于数据封装、控制访问权限等需求。
以下哪个类定义是“默认私有继承”?
正确答案:A(class 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++ 中 class
和 struct
在功能上完全等价,它们都支持:
- 成员变量和函数
- 构造函数、析构函数
- 继承、多态、虚函数等 OOP 特性
唯一差异是默认访问权限:
class
默认成员是 privatestruct
默认成员是 public
总结: 是否使用 class
或 struct
是语义和风格问题,而不是能力或功能差异。例如:
- 简单的数据结构(如向量、坐标)用
struct
更直观 - 有封装行为、复杂逻辑的类型使用
class
更合适
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 785293209@qq.com