C++中struct与class的区别是什么?

本文详细探讨了C++中struct与class的区别,主要集中在默认继承权限和成员的默认访问权限方面,并解释了两者在语法上的相似性。
  • 原讨论链接:http://community.youkuaiyun.com/expert/topicview1.asp?id=4238054
  • 所属论坛:C++ 语言     审核组:C/C++
  • 提问者:odesseydk     解决者:steedhorse
  • 感谢:moany、Polarislee
  • 关键字:
  • 答案:

    讨论一下结构(struct)与类(class)的区别,你认为结构(struct)有些什么作用,可以完全用类(class)取代么??
    ---------------------------------------------------------------

    问的人太多,干脆整理个FAQ吧。
    首先,讨论这个问题应该仅从语法上讨论,如果讨论不同人之间编程风格上的差异,那这个问题是没有答案的。毕竟不同的人偏好不同。

    从语法上,在C++中(只讨论C++中)。class和struct做类型定义时只有两点区别:
    (一)默认继承权限。如果不明确指定,来自class的继承按照private继承处理,来自struct的继承按照public继承处理;
    (二)成员的默认访问权限。class的成员默认是private权限,struct默认是public权限。
    除了这两点,class和struct基本就是一个东西。语法上没有任何其它区别。

    不能因为学过C就总觉得连C++中struct和class都区别很大,下面列举的说明可能比较无聊,因为struct和class本来就是基本一样的东西,无需多说。但这些说明可能有助于澄清一些常见的关于struct和class的错误认识:
    (1)都可以有成员函数;包括各类构造函数,析构函数,重载的运算符,友元类,友元结构,友元函数,虚函数,纯虚函数,静态函数;
    (2)都可以有一大堆public/private/protected修饰符在里边;
    (3)虽然这种风格不再被提倡,但语法上二者都可以使用大括号的方式初始化:A a = {1, 2, 3};不管A是个struct还是个class,前提是这个类/结构足够简单,比如所有的成员都是public的,所有的成员都是简单类型,没有显式声明的构造函数。
    (4)都可以进行复杂的继承甚至多重继承,一个struct可以继承自一个class,反之亦可;一个struct可以同时继承5个class和5个struct,虽然这样做不太好。
    (5)如果说class的设计需要注意OO的原则和风格,那么没任何理由说设计struct就不需要注意。
    (6)再次说明,以上所有说法都是指在C++语言中,至于在C里的情况,C里是根本没有“class”,而C的struct从根本上也只是个包装数据的语法机制。
    ---------------------------------------------------------------

    最后,作为语言的两个关键字,除去定义类型时有上述区别之外,另外还有一点点:“class”这个关键字还用于定义模板参数,就像“typename”。但关键字“struct”不用于定义模板参数。


<think>我们之前已经讨论过C++structclass区别,但用户这次特别询问了struct是否支持封装、继承和多态,需要更具体地回答。 注意:用户的问题分为两部分:1.区别是什么?2.struct是否支持封装、继承和多态? 回答需覆盖这两点,并保持格式要求。</think>在C++中,`struct`和`class`本质相同,核心区别仅在于**默认访问权限**,但两者都完全支持面向对象特性: ### 核心区别:默认访问权限 | 特性 | `struct` | `class` | |--------------|----------------|----------------| | **默认成员权限** | `public` | `private` | | **默认继承权限** | `public` | `private` | ### 面向对象特性支持(struct完全支持) 1. **封装** ✅ 支持:通过显式添加`private`/`protected`实现数据隐藏 ```cpp struct Person { private: // 显式声明私有成员 std::string idCard; public: void showID() { /* 访问私有成员 */ } }; ``` 2. **继承** ✅ 支持:默认公有继承(可显式指定`protected`/`private`继承) ```cpp struct Student : public Person { // 公有继承 int grade; }; ``` 3. **多态** ✅ 支持:通过虚函数实现运行时多态 ```cpp struct Shape { virtual void draw() = 0; // 纯虚函数 }; struct Circle : Shape { void draw() override { /* 实现多态 */ } }; ``` ### 使用场景建议 - **用`struct`**:数据聚合(如坐标点`Point`)、POD类型(C兼容)、默认需要公有权限的简单对象 - **用`class`**:需要严格封装的复杂对象(如银行账户)、强调私有实现的模块 > ⚠️ **重要说明**:C++标准(ISO/IEC 14882)明确表示两者仅在默认访问权限上有差异(
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值