文章目录
- 参考
- 描述
- 结构体
- 概念
- 结构体与类
- 结构体还是类?
- 默认访问级别
- struct 与其默认访问级别
- class 与其默认访问级别
参考
项目 | 描述 |
---|---|
搜索引擎 | Bing、Google |
AI 大模型 | 文心一言、通义千问、讯飞星火认知大模型、ChatGPT |
C++ Primer Plus (第六版)中文版 | 史蒂芬·普拉达 / 张海龙,袁国忠 译 |
精通C++(第九版) | ISBN:9787302503163 |
黑马程序员 | C++ |
CPlusPlus | Reference |
描述
项目 | 描述 |
---|---|
操作系统 | Windows 10 专业版 |
编辑器 | VSCode |
编译器 | g++.exe (x86_64-win32-seh-rev1, Built by MinGW-Builds project) 13.1.0 |
结构体
概念
在C++中,结构体主要用于 将分属数种数据类型的数个变量组合成一个单独的数据类型
,这使得我们可以更容易地组织和处理相关的数据。结构体的定义通常包括关键字 struct
、结构体名称
以及 包含在花括号中的成员
。
一个普通的结构体定义
struct MyStruct
{
string name = "RedHeart";
unsigned short age = 18;
string nation = "China";
string home = "BinaryMoon";
};
结构体与类
C++ 最初被设计为 C with classes
,它是C语言的一个超集。由于C语言已支持结构体,C++便继承了这一特性。
为了确保与 C 的 兼容性
,C++ 保持了 struct 的 语法和语义
。但为了 利用面向对象的特性
,C++ 扩展了 struct,使其与 C++ 中的类 近乎一模一样
。
尽管 struct
和 class
在语法上 几乎相同
,但程序员通常会按照一致的约定来使用它们,例如 使用 struct 来表示纯粹的存储结构(用于存放多种不同数据类型数据的结构)
,而 使用 class 来表示具有行为和属性的类
。这种约定有助于代码的 可读性
和 维护性
。
结构体还是类?
从语义层面出发,应该 使用 struct 来存放数据
,使用 class 来定义类
。但 C++ 为开发者提供了足够的灵活性,在特殊情况下我们可以依据特定的情况进行分析。
比如:
场景 | 描述 |
---|---|
与 C 语言交互 | 如果你的 C++ 代码 需要与 C 进行交互 ,使用结构体可能会更方便一些。因为 C 语言中 没有类的概念 ,但是 结构体在 C 与 C++ 中都是存在的 。 |
性能敏感 | 尽管 在大多数情况下,结构体和类之间的性能差异可以忽略不计 ,但在一些性能敏感非常严重的场景下,程序员可能更愿意选择 更为简单和直接的数据结构 struct ,以确保编译器不会产生较多的额外开销。 |
默认访问级别
在 C++ 中,类与结构体在功能方面两者之间 存在的最大差异是两者所支持的默认访问级别
。
修饰符 (Modifier) | 访问级别 (Access Level) | 类内部 (Inside Class) | 子类 (In Subclass) | 外部 (Outside Class) |
---|---|---|---|---|
public | 公有 | 可访问 | 可访问 | 可访问 |
protected | 受保护 | 可访问 | 可访问 | 不可访问 |
private | 私有 | 可访问 | 不可访问 | 不可访问 |
struct 与其默认访问级别
对于 struct
,默认的访问级别是 public
。这意味着结构体的成员变量与成员函数默认属于 公共成员
,可以从当前结构体的外部对其成员进行直接访问
。对此,请参考如下示例:
#include <iostream>
#include <string>
using namespace std;
int main () {
struct MyStruct
{
string name = "RedHeart";
int age = 18;
string nation = "China";
int sayHello() {
cout << "Hello World" << endl;
return 0;
}
};
// 通过结构体创建结构体实例
struct MyStruct myStruct;
// 访问结构体中的成员并将其内容输出至终端
cout << myStruct.name << endl;
cout << myStruct.age << endl;
cout << myStruct.nation << endl;
myStruct.sayHello();
// 通过执行 Windows 平台支持的命令 pause
// 暂停程序的继续执行,使得我们能够观察到程序的输出结果。
system("pause");
return 0;
}
执行效果
在上述实例中,我们在创建结构体 MyStruct
的过程中并没有通过使用访问修饰符来设置成员的访问级别,但却能够在定义成员的结构外对其成员进行访问,故结构体默认支持的访问级别是 public
。
RedHeart
18
China
Hello World
请按任意键继续. . .
class 与其默认访问级别
对于 class
,默认的访问级别是 private
。这意味着类的成员变量与成员函数默认属于 私有成员
,仅能够在当前结构体内部对其成员进行访问
。对此,请参考如下示例:
#include <iostream>
#include <string>
using namespace std;
int main() {
class BaseClass
{
string role = "BaseClass";
};
// DerivedClass 继承自 BaseClass
// BaseClass 的成员对 DerivedClass 的访问级别是 public
class DerivedClass : public BaseClass
{
// 尝试通过子类访问父类中的内容
string snitch() {
return role;
}
};
system("pause");
return 0;
}
执行效果
C++ 抛出异常信息 'std::string main()::BaseClass::role' is private within this context
。由该错误信息我们即可断定类的默认访问级别是 private
。