C++ struct class异同

本文深入探讨了C++中class和struct在语法层面的细微差别,主要聚焦于默认继承权限和成员访问权限两个关键点。了解这些区别有助于更高效地进行面向对象编程。
从语法上,class和struct做类型定义时只有两点区别:

(一)默认继承权限。如果不明确指定,来自class的继承按照private继承处理,来自struct的继承按照public继承处理;

(二)成员的默认访问权限。class的成员默认是private权限,struct默认是public权限。

除了这两点,class和struct基本就是一个东西。语法上没有任何其它区别
<think>我们正在讨论C++中的struct。根据引用内容,structC++中不仅保留了C语言中的用法,还进行了扩展。以下将详细说明C++struct的使用和相关知识。 ### 1. structclass异同 引用[3]提到,classstructC++中都可以定义成员变量和函数,包含公有、私有和保护成员,都可以作为其他类的成员、变量或参数类型,也都可以实例化对象。它们的主要区别在于**默认访问权限**: - **struct**:默认成员访问权限为`public` - **class**:默认成员访问权限为`private` 例如: ```cpp struct MyStruct { int x; // 默认public }; class MyClass { int x; // 默认private }; ``` ### 2. struct的基本用法 #### (1) 定义与初始化 引用[2]展示了struct的定义和初始化: ```cpp #include <iostream> #include <string> using namespace std; struct STU { STU(int x, char y): age(x), name(y) {} // 构造函数 int age; char name; }; int main() { STU temp(1, 'q'); // 调用构造函数初始化 cout << temp.age << " " << temp.name << endl; // 输出:1 q return 0; } ``` **初始化方式**: - **构造函数初始化**:如上例所示,通过构造函数初始化成员。 - **聚合初始化(C++11起)**:如果struct是聚合类型(无用户声明构造函数、无私有/保护成员等),可用花括号初始化: ```cpp STU s = {2, 'a'}; // 聚合初始化 ``` #### (2) 成员函数 struct可以包含成员函数(包括构造函数、析构函数等): ```cpp struct Point { int x, y; void display() const { cout << "(" << x << "," << y << ")" << endl; } }; Point p{3,4}; p.display(); // 输出:(3,4) ``` ### 3. struct的高级特性 #### (1) 继承 struct支持继承,且默认继承权限为`public`: ```cpp struct Base { int base_data; }; struct Derived : Base { // 等价于 struct Derived : public Base int derived_data; }; ``` #### (2) 静态成员 struct可以包含静态成员: ```cpp struct Counter { static int count; Counter() { count++; } }; int Counter::count = 0; Counter c1, c2; cout << Counter::count; // 输出:2 ``` ### 4. 应用场景 引用[1]提到,struct适合管理一组逻辑相关的数据。常见场景包括: 1. **轻量级数据结构**:如坐标、颜色等 ```cpp struct RGB { uint8_t r, g, b; }; ``` 2. **函数多返回值**:替代元组,增强可读性 ```cpp struct Result { int status; string message; }; Result process(); ``` 3. **与C语言兼容**:在C/C++混合编程中传递数据 ### 5. 与class的选择建议 - 若数据结构简单且所有成员可公开访问,优先用`struct` - 若需要封装复杂行为和数据,用`class` - 在模板元编程中,`struct`常用于模板特化(因其默认public) ### 代码示例:struct实现链表节点 ```cpp struct ListNode { int val; ListNode* next; ListNode(int x) : val(x), next(nullptr) {} }; // 使用 ListNode head(0); head.next = new ListNode(1); ``` §§相关问题§§ 1. C++structclass的具体应用场景有哪些区别? 2. 如何在C++中实现struct的深拷贝? 3. struct在内存中的布局规则是什么? 4. C++11后struct有哪些新特性? </think> ### C++ 中 `struct` 的全面解析 在 C++ 中,`struct` 是一种复合数据类型,用于封装相关数据成员。相比 C 语言,C++ 中的 `struct` 功能更强大,支持面向对象特性。以下是核心知识点: #### 1. **基础定义与初始化** ```cpp #include <iostream> #include <string> using namespace std; // 基础结构体定义 struct Person { string name; int age; double height; }; int main() { // 初始化方式1:聚合初始化 Person p1 = {"Alice", 30, 165.5}; // 初始化方式2:成员赋值 Person p2; p2.name = "Bob"; p2.age = 25; p2.height = 180.0; cout << p1.name << " " << p1.age << endl; // 输出: Alice 30 } ``` - **聚合初始化**:C++11 起支持花括号初始化[^1] - **成员默认公有访问**:与 `class` 不同,`struct` 成员默认 `public` #### 2. **高级特性:构造函数与成员函数** ```cpp struct Student { // 构造函数 Student(string n, int a) : name(n), age(a) {} // 成员函数 void display() const { cout << name << ", " << age << "岁\n"; } private: // 支持访问控制 string name; int age; }; int main() { Student s("Tom", 18); s.display(); // 输出: Tom, 18岁 } ``` - 支持**构造函数**(含初始化列表) - 可定义**成员函数**和**静态成员** - 支持 `public/private/protected` 访问控制[^3] #### 3. **与 `class` 的关键区别** | 特性 | `struct` | `class` | |---------------------|----------------------|----------------------| | **默认访问权限** | `public` | `private` | | **继承默认权限** | `public` | `private` | | **使用场景** | 数据聚合 | 复杂对象封装 | ```cpp // 继承示例 struct Base { int x; }; struct Derived : Base {}; // 默认 public 继承 class CBase { int y; }; class CDerived : CBase {}; // 默认 private 继承 ``` #### 4. **内存布局与 C 兼容性** ```cpp // C++ 结构体可兼容 C extern "C" struct Point { int x, y; }; // 内存布局连续(通常) static_assert(sizeof(Point) == 2 * sizeof(int)); ``` - 内存布局与 C 结构体兼容 - 可通过 `#pragma pack` 控制内存对齐 - 支持位字段(bit-field) #### 5. **现代 C++ 特性** ```cpp // 结构化绑定 (C++17) Point p{10, 20}; auto [x, y] = p; // x=10, y=20 // 用户定义推导指引 (C++17) struct Box { int width; double weight; }; Box(int, double) -> Box; // 自定义推导规则 ``` #### 6. **应用场景** 1. **数据聚合**:坐标、配置参数等 ```cpp struct Vec3 { float x, y, z; }; ``` 2. **函数多返回值**(替代元组) ```cpp struct ParseResult { int value; bool success; }; ``` 3. **策略模式中的轻量对象** ```cpp struct Comparator { bool operator()(int a, int b) const { return a > b; } }; ``` ### 设计建议 1. **优先用 `struct` 当**: - 仅需封装数据 - 需要 C 兼容性 - 实现简单策略对象 2. **用 `class` 当**: - 需要严格封装 - 包含复杂行为逻辑 - 涉及多态继承 > 📌 **关键原则**:`struct` 和 `class` 在 C++ 中本质相同,区别仅在于默认访问权限[^3]。选择依据应是语义需求而非技术限制。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值