C++的类与C里面的struct的区别

本文探讨了C++中struct与class的区别,解释了struct的作用,并提供了从C++到C语言的简单示例。同时,文章还讨论了struct与class在语法和用法上的相似性以及它们在继承、成员访问权限等方面的主要差异。

关于使用大括号初始化
class和struct如果定义了构造函数的话,都不能用大括号进行初始化
如果没有定义构造函数,struct可以用大括号初始化。
如果没有定义构造函数,且所有成员变量全是public的话,可以用大括号初始化。

关于默认访问权限
class中默认的成员访问权限是private的,而struct中则是public的。

关于继承方式
class继承默认是private继承,而struct继承默认是public继承。

 

为什么在C++中存在struct?很多人都会想到这是为了让C++和C兼容,那么问题就是如何使用C++中的struct和C兼容起来。

把C++要交换到C程序的数据在C++程序中声明成一个struct,然后根据C++中程序的语意选择继承或者聚合这个struct,然后在使用的时候就 可以把这个struct封装起来传递到C中或者从C中传递到C++。(注:在深入探索C++对象模型中建议使用聚合,而不是继承,原因是为了和C语言的空 间分布兼容,因为在C++引入虚函数,虚继承导致了派生类的空间包括struct的空间和vptr、vbtl,而且vptr、vbtl存放在哪里由编译器 自己决定,C++标准中没有定义)。

给出一个从C++到C语言的一个简单的例子:

//C++头文件moduleA.h

#ifndef MODULE_A_H

#define MODULE_A_H

struct person
{
       int age;
       char name[20];
};

class male
{
      private:
              int wife;
              struct person per;

      public:
             int getAge()
             {
                return per.age; 
              }

};

extern "C" void print(person );

#endif

//C++的实现文件

#include "moduleA.h"

#include <stdio.h>

void print(person per)
{
        printf("age :%d, /n",per.age);
        return ;
}

/*待处理的C语言文件*/

#include <stdio.h>

extern "C"
{
       #include "moduleA.h" //或者只要这个也能通过编译
}

int main(void)
{
       person per;
       per.age = 18;
       print(per);
       return 0;

}

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

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

从语法上,在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++class、unionstruct区别,需要详细解释示例。首先,我得回忆一下这三者的基本概念。struct在CC++中的区别挺大的,C里面struct不能有成员函数,而C++class似,但默认访问权限不同。class默认是private,struct默认public。union的话,主要是共享内存,所有成员共用同一块内存空间,这点structclass不同。 然后,用户提供的引用内容里提到了一些关键点,比如structclass在继承时的默认访问权限,union的内存布局,以及它们在CC++中的不同。我需要把这些信息整理清楚,分点解释,最好每个部分都配上示例代码,让用户更容易理解。 可能需要先分别介绍structclass、union各自的定义特性,再对比它们之间的区别。例如,structclass的主要区别在于默认访问权限继承时的默认权限。而unionstruct区别在于内存分配方式,union的所有成员共享内存,而struct每个成员有独立内存。 还要注意示例代码的正确性,比如在展示union的时候,要说明同一时间只能使用一个成员,否则会出现未定义行为。同时,可能需要提到匿名union的使用场景,比如在struct内部直接使用匿名union来节省空间。 另外,用户提供的引用中有关于C++11的union支持成员函数访问控制,这一点也需要涵盖进去,说明union在C++中的增强特性。比如可以定义构造函数析构函数,但不能有虚函数,也不能继承。 最后,总结部分需要简明扼要地概括三者的主要区别,帮助用户快速回顾。还要确保回答结构清晰,分点明确,每个部分都有相应的示例解释,符合用户要求的详细程度。</think>### C++中`class`、`struct``union`的区别详解 #### 一、`struct``class`的核心区别 1. **默认访问权限** - `struct`默认成员继承为`public` - `class`默认成员继承为`private` ```cpp struct A { int x; // 默认为public }; class B { int y; // 默认为private }; struct C : B {}; // 默认public继承 class D : A {}; // 默认private继承 ``` 2. **模板特化支持** `struct`可用于模板特化,例如: ```cpp template<> struct is_union<MyStruct> {}; // 合法[^1] ``` 3. **语义差异** `struct`常用于数据聚合,`class`强调封装行为控制[^3]。 --- #### 二、`union`的独特性质 1. **内存共享机制** 所有成员共享同一内存空间,大小为最大成员所需空间: ```cpp union Data { int i; double d; // 占8字节 char c; // 全体共享8字节内存 }; ``` 2. **访问限制** - C++11起支持成员函数访问控制: ```cpp union SmartUnion { private: int code; public: void set(int x) { code = x; } // 支持成员函数[^4] }; ``` 3. **使用限制** - 不能包含虚函数 - 不能继承或被继承 - 成员不能是引用型 --- #### 三、三者对比表 | 特性 | struct | class | union | |---------------------|------------------|------------------|------------------| | 默认访问权限 | public | private | public | | 内存分配 | 独立内存 | 独立内存 | 共享内存 | | 支持继承 | 是 | 是 | 否 | | 成员函数 | 支持 | 支持 | C++11起支持 | | 虚函数 | 支持 | 支持 | 不支持 | --- #### 四、典型应用场景 1. **`struct`适用场景** - 数据聚合(如坐标点) - C兼容数据结构 ```cpp struct Point { int x, y; // 显式声明数据聚合 }; ``` 2. **`union`适用场景** - 型转换(如浮点数的二进制解析) - 内存敏感场景(如嵌入式系统) ```cpp union FloatConverter { float f; unsigned int bytes; // 共享4字节内存 }; ``` 3. **`class`适用场景** - 需要封装的复杂对象(如文件处理器) - 多态继承体系 --- #### 五、进阶特性对比 1. **匿名union** 可直接嵌入struct/class中节省内存: ```cpp struct Variant { enum Type { INT, FLOAT } type; union { int i; float f; // i共享内存 }; }; ``` 2. **大小端验证示例** ```cpp union EndianChecker { uint32_t value; uint8_t bytes[4]; }; // 输出bytes[0]可判断系统字节序[^2] ``` ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值