C/C++ struct和class区别详解

先来讲下C和C++中struct (结构体) 之间的区别:

在C中struct只单纯的用作数据的复合类型,也就是说,在结构体声明中只能将数据成员放在里面,而不能将函数放在里面 例如:

struct Base{            //public
	char v1;
	int v2;
	double v3;
	void show();    //error!
};
并且在C结构体中所有成员默认均是公有类型(public)也就是说在结构体外部可以直接通过结构体变量对成员进行访问,例如下面C代码:

	struct Base s1;		//在C中定义结构体变量方式
	s1.v1 = 'A';
	s1.v2 = 10;
	s1.v3 = 95.6;
在C结构体声明中不能使用C++访问修饰符,如:public、protected、private 而在C++中可以使用,例如下面C++代码:

struct BasePlus{       //public
	int v0;
private:
	char v1;
protected:
	float v2;
public:
	double v3;
};
各修饰符之间有什么区别呢?看下面C++代码:

	BasePlus s1;            //or struct BasePlus s1
	s1.v0 = 10;             //正确
	s1.v1 = 'A';            //错误
	s1.v2 = 11.3;           //错误
	s1.v3 = 96.5;           //正确
到这里大家可以看到在定义结构体变量的时候有所不同,在C中必须使用struct关键字加结构体类型名来定义变量,如:struct Base s1; 而在C++中可以只使用结构体类型名来定义结构体变量,如:BasePlus s1; 在C中不允许这么定义。

另外在上面代码中可以看到s1结构体中的成员v0是在所有访问修饰符之前定义的,在结构体外部可以直接访问,因为结构体在没有显式设置访问修饰符的时候都是publict公有类型,跟显式设置publict公有类型的double v3一样,可以在外部直接访问,而v1和v2均不能在结构体外部使用,因为一个是protected(保护修饰符)一个是private(私有修饰符)。

而且C的结构体不能继承(没有这一概念)而C++的结构体可以继承并且还可以定义成模版。例如C++中下面代码也是正确的:

struct Base1{
	int v1;
	double v2;
};

struct Base2 : public Base1{           //Base2公有继承结构体Base1 那么Base2里面将有v1和v2成员
	char v3;
};

Base2 s1;
s1.v1 = 10;             //从Base1继承来的v1
s1.v2 = 13.5;           //从Base1继承来的v2
s1.v3 = 'A';
template <class T>       //结构体模版
struct Base{
	T Arr[10];
	int v1;
};

Base<char> s1;           //实例化成char类型
strcpy(s1.Arr,"Keller");
s1.v1 = 10;
std::cout << s1.Arr << "," << s1.v1 << std::endl;           //输出:Keller,10
在上面已经说了,C结构体中只能定义数据类型,不能定义函数。而C++结构体中不仅可以定义数据,还可以定义函数,因为C++结构体是对C结构体的扩充,使之能像C++类一样。例如在C++中下面结构体声明是可行的:

struct BasePlus{
	char v1;
private:
	int v2;
public:
	void show(){std::cout << "v1:" << v1 << ", v2:" << s2 << std::endl;}
};
这样就可以在结构体外部通过结构体变量调用该函数,然后该函数可以直接对结构体内的成员数据进行处理。

上面介绍了C和C++的struct之间的区别,既然C++结构体对C结构体进行了扩充并使其能像C++类一样,那么下面再来讲下C++结构体(struct) 和C++类(class) 之间的区别。

在C++中可以把struct当成是一个类类型,只是他与C++原始的类不同的是,struct默认访问权限是public(上面讲过)可以在外部直接访问,而class默认访问权限是private,外部无法直接访问。只能在通过public修饰符下的函数进行间接访问。这里说的直接访问指的是:可以通过结构体实例或类实例进行直接调用该成员的。例如下面代码:

class classBase1{       //default private
	int v1;
};

struct structBase2{     //default public
	int v1;
};
	classBase1 cB1;
	structBase2 sB1;
	cB1.v1 = 10;    //错误!不可访问
	sB1.v1 = 10;    //正确!可访问
从上面代码可以看出通过class定义的成员在不加public修饰符的情况下在外部是不允许访问的,这也实现了数据隐藏!而通过struct定义的成员在不加任何修饰符的情况下,在外部是可以直接访问的。这说明他们俩的默认访问权限不同!抛开这个区别,struct和class都是差不多的了。都可以定义在内部定义数据,定义函数,以及都允许继承和用作模版。

虽然struct和class很相像,但我在这里还是建议大家如果成员只是用作存放数据的话,还是使用struct,因为他是数据结构的实体,如果需要存放数据,并且需要定义一系列处理该数据的功能函数,还是建议使用class,毕竟这是类的实体。

好了,上面讲的如果有什么不正确的地方,还请大家指出来,共同进步,谢谢了~




  • 4
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在C++中,结构体和类都是由多个成员变量组成的。为了在内存中高效地存储这些成员变量,编译器会对结构体和类进行内存字节对齐。 内存字节对齐是指将结构体或类中的成员变量按照一定的规则排列,使得每个成员变量的内存地址都是其长度的整数倍。这样一来,访问这些成员变量时就可以减少内存访问次数,提高访问效率。 内存字节对齐的规则如下: 1. 结构体或类的起始地址必须是其最宽基本类型成员的整数倍。 2. 结构体或类的每个成员变量相对于起始地址的偏移量必须是其类型大小的整数倍。 3. 结构体或类的总大小必须是其最宽基本类型成员大小的整数倍。 例如,一个结构体中有两个成员变量,一个是int类型,一个是char类型。如果按照默认的字节对齐规则排列,结构体的内存布局如下: ``` struct MyStruct { int a; char b; }; // 内存布局 // +---+---+ // | a | b | // +---+---+ ``` 这里,int类型占用4个字节,char类型占用1个字节。因此,编译器会按照4字节对齐的方式排列结构体。由于int类型是最宽的基本类型,所以结构体的起始地址必须是4的倍数,而char类型则放在了4字节边界上。 需要注意的是,内存字节对齐规则可能会因为编译器的不同而产生变化。有些编译器允许开发者通过预处理指令来指定结构体的对齐方式,例如: ``` struct MyStruct { int a; char b; } __attribute__((aligned(8)))); ``` 这里,`__attribute__((aligned(8)))`表示MyStruct结构体需要以8字节对齐的方式排列。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值