%%
# 纲要
> 主干纲要、Hint/线索/路标
# Q&A
#### 已明确
#### 待明确
> 当下仍存有的疑惑
**❓<font color="#c0504d"> 有什么问题?</font>**
# Buffer
## 闪念
> sudden idea
## 候选资料
> Read it later
%%
# class 与 struct 的区别
**==唯一区别==**:**class 的默认访问权限**是 `private`,**struct 的默认访问权限**是 `public`,包括两点:
1. 对**类内成员**的**默认访问权限**;
2. 该类对基类的**默认派生访问权限**,即 "**继承方式**";
```cpp
class MyClass : Base { // 对基类的默认派生访问权限为"private", 即默认private继承
// 对类内成员的默认访问权限为"private"
}
struct MyStruct : Base { // 对基类的默认派生访问权限为"public", 即默认public继承
// 对类内成员的默认访问权限为"public"
}
```
**除此之外,struct 和 class 在定义一个类上完全相同**。
例如:
- 使用 `struct` 声明的结构体,可以使用关键字 `class` 来进行**前置声明**。
- `enum class` 与 `enum struct` 都可用于**声明具有作用域的强枚举类型**,两个关键字完全等价。
> [!NOTE] "**类/class"的特性是由"声明本身"(declaration body)来决定的**,而不是由关键字 `struct` 或 `class` 决定的。
> [!info] 关于 struct
> struct 源自 C 语言,彼时用于表示一个"**==数据集合体==**",没有 private data,也没有对 data 的相应操作(即成员函数)。
> C struct 在 C++中的一个合理用途,是**当要传递"一个复杂的 class object 的全部或部分"到某个 C 函数中时,struct 可用于对数据进行封装**。
示例一:
```cpp
// 定义ListNode结构体
struct ListNode {
int val;
ListNode *next;
ListNode() : val(0), next(nullptr) {}
ListNode(int x) : val(x), next(nullptr) {}
ListNode(int x, ListNode *next) : val(x), next(next) {}
};
```
示例二:
```cpp
template <typename T>
struct MyStruct {
T value;
void doSomething() {
// ...
}
};
int main() {
MyStruct<int> intStruct;
intStruct.value = 5;
intStruct.doSomething();
MyStruct<std::string> stringStruct;
stringStruct.value = "Hello";
stringStruct.doSomething();
}
```
<br>
#### 其它作为关键字使用时的细微区别
声明**模版的类型参数**时,**`class` 关键字与 `typename` 完全等价**,但不能用 `struct`
> C++最初使用 `template <class T>` 声明模板参数。
> 后来,为了更清楚地表明 T 是一个类型参数,C++引入了`template <typename T>` 语法。
```cpp
template <class T> // 这里的`class`关键字与`typename`是完全等价的
class MyClass {
//...
};
template <typename T>
void myFunction(T param) {
// ...
}
```
<br><br>
# 参考资料
# Footnotes