C++ 类和结构体的对比

我一开始只学习过C语言中的结构体,并且认为C++里的结构体和C里的是一样的,在C++中也一直按照C的方式使用结构体。但我后来发现,C++中的结构体和类在语法上好像没什么两样,给我造成了很大困惑。究竟C++中的类和结构体有何异同?要解决这个问题,让我们先从C中的结构体说起。

C语言中的结构体

(1)由于C语言是面向过程的,所以C中的结构体就不存在面向对象的任何特点:不能继承;不能封装;不能多态;不存在访问控制,只有作用域。

(2)C语言中的结构体只能定义数据,而不不能定义方法,虽然C语言的结构体中不能定义函数,但是却可以定义函数指针,不过函数指针本质上不是函数而是指针。

(3)C语言中的结构体不能为空,否则会报错。定义一个结构体的变量时,结构体名前的struct关键字不能省略,否则会报错。

struct  A
{
    int num;
};
int main()
{
    struct A a = { 1 };
}

C++中的类和结构体

C++中的struct对C中的struct进行了扩充,它已经不再只是一个包含不同数据类型的数据结构了,具有class的特性,而class也可用作struct:

  1. C++中的类和结构体都可以继承,struct可以继承class,同样class也可以继承struct。
  2. C++中的类和结构体都可以封装,两者都可以包含成员变量和成员方法,都可以具有构造函数和析构函数。
  3. C++中的类和结构体都可以多态,允许成员函数是虚函数可以多态。
  4. C++中的类和结构体都具有访问控制,都可以用public、protected、private修饰其成员变量和成员方法。
  5. C++中的类和结构体都是按指传递的。另外,都可以同过彼此的方式初始化(此时情况较多,读者可自行总结)。
class A
{
public:
	int a;
	int b;
};
struct B
{
	int a;
	int b;
	B(int a, int b)
	{
		(*this).a = a;
		(*this).b = b;
	}
};
int main()
{
	A a = { 1, 2 };	    //A是类
	B b(1, 2);	    //B是结构体
	return 0;
}

而struct和class之间最本质的一个区别就是默认的访问控制: struct默认的数据访问控制是public的,而class默认的成员变量访问控制是private的。

在继承方面,struct可以继承class,class同样可以继承struct。但是,struct默认是public继承,class默认是private继承。也就是说,在不指定继承方式时,struct是public继承父类的,class是private继承父类的,无论父类是class还是struct。具体继承规则如下:

子类对基类成员的访问权限
基类成员的访问权限public继承protected继承private继承
public在子类中为public在子类中为protected在子类中为private
protected在子类中为protected在子类中为protected在子类中为private
private在子类中隐藏在子类中隐藏在子类中隐藏

总之,当你显式指定各自的访问权限时,两者就会变得相同。所以,对于访问控制,应该在程序里明确的指出,而不是依靠默认,这是一个良好的习惯,可以避免一些不必要的麻烦,也让你的代码更具可读性。

<think>我们正在讨论C++中的(class)、结构体(struct)联合体(union)的异同点。根据引用内容,我们可以总结如下:1.结构体(struct)在C++中得到了扩展,可以包含函数(方法),因此具有的功能。与不同的是,结构体中的成员(包括数据函数)默认访问权限是public,而的默认访问权限是private(引用[1])。2.联合体(union)是一种特殊的数据型,它允许在相同的内存位置存储不同的数据型。联合体的所有成员共享同一块内存空间,因此联合体的大小由其最大成员决定。在任何时候,联合体只能有一个成员处于活动状态(引用[3],[4])。3.(class)是C++中面向对象编程的核心,它封装了数据操作数据的函数,并支持继承、多态等特性。的成员默认是私有的(private)。4.结构体C++中非常相似,唯一的区别是默认访问权限(结构体默认public,默认private)。实际上,结构体也可以有构造函数、析构函数、成员函数,也可以继承等(引用[1])。5.联合体与结构体的主要区别在于内存使用方式:联合体的成员共享内存,而结构体的每个成员拥有独立的内存空间。因此,联合体的大小等于其最大成员的大小,而结构体的大小至少是其所有成员大小的总(考虑内存对齐)。6.联合体通常用于节省内存,特别是在需要表示多种型但只同时使用一种型的情况下。结构体则用于将相关数据(函数)组合在一起。7.联合体不能有虚函数,也不能作为基使用,即不支持继承。而结构体都支持继承多态(引用[4])。8.在C++11之后,联合体也可以包含非平凡型(如带有构造函数的),但使用起来需要特别注意。下面我们用一个表格来总结它们的异同点:|特性|(class)|结构体(struct)|联合体(union)||--------------------|----------------|----------------|--------------------||默认访问权限|private|public|public(成员默认是public)||成员内存布局|每个成员独立|每个成员独立|所有成员共享同一块内存||是否支持成员函数|是|是|是(但有较多限制)||是否支持继承|是|是|否||是否支持多态|是|是|否||大小|至少为所有成员大小之(考虑对齐)|同左|等于最大成员的大小(考虑对齐)||主要用途|封装数据行为|封装数据(或行为)|节省内存,同一时间只使用一种型|示例代码:```cpp//结构体示例structPoint{intx;inty;voiddisplay(){cout<<"("<<x<<","<<y<<")"<<endl;}};//示例classCircle{private:doubleradius;public:Circle(doubler):radius(r){}doublearea(){return3.14*radius*radius;}};//联合体示例unionData{inti;floatf;charc;};```在上面的例子中:-`Point`结构体有两个整型成员一个成员函数,默认访问权限为public。-`Circle`有一个私有成员`radius`,以及一个公有成员函数`area`。-`Data`联合体有三个成员,它们共享同一块内存。注意:在联合体中,同时只能使用一个成员。例如:```cppDatad;d.i=10;//此时使用i成员cout<<d.i<<endl;d.f=1.23;//此时使用f成员,但i的值已经被覆盖cout<<d.f<<endl;```联合体在同时只能存储一个值,因此给一个成员赋值会覆盖其他成员的值。总结:-结构体在功能上几乎相同,主要区别在于默认访问权限。通常,结构体用于简单的数据聚合,用于需要封装复杂功能的场合。-联合体主要用于节省内存,特别是当多个成员不会同时使用时。§§相关问题§§1.C++结构体在继承方面有什么具体区别?2.联合体在C++11之后有哪些新特性?3.在什么情况下应该使用结构体而不是?4.联合体能否包含有构造函数的型成员?5.结构体联合体在内存对齐方面有何不同?</think>### C++结构体与联合体的异同分析 #### 1. **核心区别** - **访问控制** - (`class`):成员**默认私有**(`private`) - 结构体(`struct`):成员**默认公有**(`public`) - 联合体(`union`):成员**始终公有**(无法声明私有成员) - **内存模型** - 结构体/:每个成员拥有**独立内存空间**,总大小 ≥ 各成员大小之(考虑内存对齐) $$\text{sizeof(struct)} \geq \sum \text{sizeof(members)}$$ - 联合体:所有成员**共享同一内存块**,大小由最大成员决定 $$\text{sizeof(union)} = \max(\text{sizeof(members)})$$ ```cpp union Data { // 大小固定为4字节(int) int id; // 与name/age共享内存 char name; float age; }; ``` #### 2. **功能特性对比** | 特性 | (`class`) | 结构体(`struct`) | 联合体(`union`) | |---------------------|-------------------|-------------------|-------------------| | 成员函数 | ✅ | ✅ | ✅ (C++11起) | | 继承/多态 | ✅ | ✅ | ❌ | | 构造函数/析构函数 | ✅ | ✅ | ✅ (限制较多) | | 虚函数 | ✅ | ✅ | ❌ | | 模板支持 | ✅ | ✅ | ✅ | #### 3. **使用场景** - **结构体**:数据聚合(如坐标点、链表节点) ```cpp struct Point { // 默认public访问 int x; int y; void print() { cout << x << "," << y; } }; ``` - ****:封装复杂逻辑(如游戏角色、银行账户) ```cpp class Account { private: double balance; // 默认private public: void deposit(double amt) { ... } }; ``` - **联合体**:内存敏感场景(如协议解析、型转换) ```cpp union FloatConverter { float f; unsigned char bytes[4]; }; // 通过bytes直接访问float内存表示 #### 4. **关键共同点** 1. **自定义型**:三者均属用户定义型(UDT) 2. **成员包含**:均可包含数据成员函数成员(C++11起联合体支持成员函数) 3. **访问控制**:均支持`public/protected/private`(联合体仅限`public`) 4. **内存对齐**:均受内存对齐规则影响 > ⚠️ **联合体注意事项** > 修改任一成员会覆盖其他成员值(共享内存): > ```cpp > union { int a; char b; } u; > u.a = 0x12345678; > cout << u.b; // 输出0x78(依赖字节序) > ``` #### 5. **典型差异示例 ```cpp #include <iostream> using namespace std; struct MyStruct { int x; }; // 默认public class MyClass { int x; }; // 默认private union MyUnion { int id; double value; // 共享8字节内存 }; int main() { MyStruct s = {10}; // 直接初始化 MyClass c; // x不可直接访问 MyUnion u; u.id = 100; // 此时u.value被覆盖 cout << sizeof(u); // 输出8(double大小) } ``` ### 总结对比表 | **特性** | **结构体(struct)** | **(class)** | **联合体(union)** | |------------------|-------------------|--------------|------------------| | 默认访问权限 | public | private | public | | 内存分配方式 | 独立内存 | 独立内存 | 共享内存 | | 继承支持 | ✅ | ✅ | ❌ | | 多态支持 | ✅ | ✅ | ❌ | | 成员函数 | ✅ | ✅ | ✅ (受限) | | 内存敏感场景适用 | ❌ | ❌ | ✅ | > 引用说明:C++结构体可包含函数且默认public[^1],联合体成员共享内存空间[^3][^4],结构体核心差异在默认访问权限[^1]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值