%% # 纲要 > 主干纲要、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