C++ 中 struct 和 class 的联系和区别

本文详细介绍了C++中struct与class的区别,包括默认继承权限、成员的默认访问权限等,并探讨了两者在实际应用中的选择依据。

struct vs class

在 C++ 中class 和 struct  只有两点主要区别:

  • 默认继承权限。默认情况下,class的继承是以private来继承而struct则是按照public进行继承。
  • 成员的默认访问权限。class的成员默认是private权限,struct默认是public权限。

而其它的特性,struct和class基本上,甚至严格来说是一样的:

01//一个不常见的示例,将 struct 直接改为class也能编译通过。
02//编译环境为 GCC 4.4.1
03#include <iostream>
04#include <string>
05using namespace std;
06 
07struct bar
08{
09    private// 访问权限修饰符
10        int y;
11    public:
12        bar(){}; //无参构造函数
13        bar(int a){ y = a;}//带参数的构造函数
14        ~bar(); //虚构函数
15        void say();
16        virtual void func1() = 0; //纯虚函数
17};
18 
19struct  foo: protected bar // 继承
20{
21    private:
22          int x;
23    public:
24         foo(){};
25         void say(string msg) {cout<<msg<<endl;}
26         virtual int func2();//虚函数
27 
28};
29 
30int main() {
31    return 0;
32}

可以看到:

  • 都可以有成员函数:struct可以包含和class中一样的构造函数,析构函数,重载的运算符,友元类,友元结构,友元函数,虚函数,纯虚函数,静态函数;
  • 尽管默认访问权限不同,但都可以拥有public/private/protected修饰符;
  • 都可以进行复杂的继承和多重继承,一个struct可以继承自一个或多个class,反之亦可。
  • 注意这里与C语言并不相同,C 语言中的 struct 从本质上来说只是一个包装数据的语法机制。


在 Google C++编程风格指南 中也声称:

仅当叧有数据时使用 struct,其它一概使用 class。

在 C++中,关键字struct和 class 几乎含义等同,我们为其人为添加语义,以便为定义的数据类型合理选择使用哪个关键字。

struct 被用在仅包含消极对象( passive objects)上,可能包括有关联的常量,但没有存取数据成员外的函数功能,而存取功能通过直接访问实现而无需方法调用,这儿提到的方法是指只用于数据成员的,如构造函数、析构函数、Initialize()、Reset()、Validate()。

如果需要更多的函数功能,class 更适合,如果不确定的话,直接使用 class。

如果不 STL结合,对于仿函数(functors)和特性(traits)可以不用 class 而是使用struct。

虽然一些C++专家声称可以不再使用struct关键字,而可以总是使用class { public:}来代替。但事实上,struct仍在代码中广泛使用,开发人员常使用struct(部分也是由于C语言的影响)来表示一个轻量级的并不需要严格封装的记录,例如,一个写入文件的记录或数据库表结构就常用struct来声明;而class则主要是用来进行面向对象编程。

在一般情况下,仍必须使用struct结构的主要原因是:

  • 开发维护遗留系统。
  • 需要与传统的API进行通讯。

当然,有时使用struct可以让代码看起来更简洁:

1struct Compare { bool operator() { ... } };
2std::sort(collection.begin(), collection.end(), Compare());

C++ 中的高级特性和语法细节太多,因此遵循一定的编程规范还是很有必要的。

<think>好的,我现在需要回答用户关于C++structclass差异的问题。首先,我得回顾一下自己之前学过的相关知识,确保信息的准确性。记得在C++中,structclass的主要区别在于默认的访问权限继承权限。struct默认是public的,而class默认是private的。这一点是最基本的区别,应该放在最前面说明。 接下来,用户提供的引用中有提到structC++中会建立作用域,而C中不会,这点可能涉及到成员变量嵌套结构的作用域问题。需要确认一下,C++struct是否允许成员枚举嵌套结构,而C中的struct是否有不同的行为。引用[2]提到在C中,嵌套的结构体会逃逸到父结构体所在的函数作用域中,而C++则保持它们的作用域在struct内部。这可能是一个重要的差异点,但用户主要关心的是C++中的structclass,所以可能需要简要提到这一点,但重点放在C++上。 然后,引用[3]指出class是用户定义的类型,具有数据函数,而struct在C中更多是数据集合。但在C++中,struct同样可以包含成员函数、构造函数、继承等,几乎class一样的功能。所以需要强调两者在功能上的相似性,以及默认访问权限的不同。 引用[4][1]都提到了类结构体之间的差异,除了默认访问权限外,还有继承时的默认访问权限不同。例如,struct继承时默认是public继承,而class默认是private继承。这一点也是关键区别,需要详细说明。 另外,模板参数中使用classstruct区别,比如template<typename T>template<class T>是否等价。根据之前的了解,它们是等价的,但可能在某些情况下有不同的习惯用法,需要确认这一点是否正确。 用户的问题还可能涉及到使用场景的建议,比如何时使用struct,何时使用class。根据惯例,struct通常用于数据聚合,没有复杂的成员函数,而class用于需要封装复杂行为的对象。需要提到这些惯例,并引用相关的资料来支持。 还需要注意语法上的其他差异,比如定义构造函数时是否需要public声明,或者在继承时的默认访问控制。例如,struct D : Base 默认是public继承,而class D : Base 默认是private继承。 此外,模板元编程中是否倾向于使用struct,因为其成员默认public,可能更方便模板特化时的访问。这也是一个使用场景的区别。 最后,要确保回答的结构清晰,分点列出主要差异,并给出使用建议。同时,按照用户的要求,生成相关问题,帮助用户进一步学习。 总结需要涵盖的要点: 1. 默认访问权限:struct的成员继承默认public,class默认private。 2. 继承时的默认访问权限差异。 3. 使用习惯:struct用于数据聚合,class用于对象封装。 4. 模板参数中的使用习惯。 5. 其他语法差异,如构造函数是否需要public。 6. 模板元编程中的应用场景。 需要验证这些信息是否正确,尤其是关于继承默认权限模板参数的部分。比如,struct继承时确实是public,而class继承是private,这点需要确认。模板参数中,classtypename可以互换,而struct不能作为模板参数的关键字,可能记错了。实际上,template<typename T>template<class T>是等价的,而struct不是用于模板参数声明的,所以这里可能需要修正。 在生成回答时,要确保每个差异点都有引用支持,如引用[3]提到class的数据函数,引用[4]提到继承默认权限的不同。 最后,生成的相关问题要围绕structclass的差异、使用场景、历史演变等方面,帮助用户深入理解。</think>### C++structclass的差异分析 在C++中,`struct``class`的核心差异主要体现在**默认访问权限****继承行为**上,同时两者在代码风格使用场景上也有不同惯例。 #### 1. 默认访问权限 - **`struct`**:成员变量成员函数默认是`public`的。例如: ```cpp struct Point { int x; // 默认为public int y; }; ``` - **`class`**:成员变量成员函数默认是`private`的。例如: ```cpp class Circle { double radius; // 默认为private public: double getArea() { return 3.14 * radius * radius; } }; ``` 这一差异直接影响代码的封装性设计[^3][^4]。 #### 2. 继承时的默认权限 - **`struct`派生**:默认采用`public`继承。例如: ```cpp struct Derived : Base { /* 默认public继承 */ }; ``` - **`class`派生**:默认采用`private`继承。例如: ```cpp class Derived : Base { /* 默认private继承 */ }; ``` 若需其他权限,需显式声明(如`class Derived : public Base`)[^4]。 #### 3. 使用场景与惯例 - **`struct`**: - 适用于**数据聚合**(如坐标点、配置参数)。 - 模板元编程中,因默认`public`权限便于操作成员[^2]。 - 与C语言兼容时优先使用。 - **`class`**: - 强调**封装性****复杂行为**(如银行账户、图形对象)。 - 需要隐藏内部状态或实现细节时首选[^1]。 #### 4. 其他语法细节 - **构造函数**:`struct`可以直接定义构造函数而无需`public`标签: ```cpp struct Data { Data(int a) : val(a) {} // 隐式public int val; }; ``` 而`class`中若需外部调用构造函数,需显式声明为`public`。 - **模板参数**:声明模板时,`class``typename`等价,但`struct`不能用于模板参数声明: ```cpp template<class T> // 合法 template<struct T> // 非法 ``` #### 5. 历史演变 - **C语言中的`struct`**:仅支持数据成员,无作用域嵌套(成员枚举会“逃逸”到外层)[^2]。 - **C++增强**:引入成员函数、继承、访问控制等,使`struct`功能与`class`几乎一致,仅默认行为不同。 --- ### 使用建议 - **选择`struct`**:简单数据集合、与C交互、模板元编程。 - **选择`class`**:需要封装、多态或复杂逻辑的场合。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值