5

C++面试八股文:struct、class和union有哪些区别? - 二进制架构

 1 year ago
source link: https://www.cnblogs.com/binarch/p/17456011.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

C++面试八股文:struct、class和union有哪些区别?

某日小二参加XXX科技公司的C++工程师开发岗位5面:

面试官:struct和class有什么区别?

小二:在C++中,struct和class的唯一区别是默认的访问控制。struct默认的成员是public的,而class的默认成员是private的。

面试官:struct、class和union有哪些区别?

小二:union和struct、class在内存布局上不同。union实例的所有成员共享一块内存,这块内存的大小等同于union中成员尺寸最大的一个。

面试官:你能列举一下union适合使用的场合吗?

小二:额。。(我哪知道啊,从来没用过。。)

面试官:好的,回去等通知吧。

对于这三个关键字,相信小伙伴们对前两个关键字并不陌生,但是对于union可能用的会少一些。

union最开始的出现是为了解决内存占用的问题。例如你需要存储一个IP地址,但是你并不知道IP的类型,你需要:

struct IP
{
	char ipv4[4];
	char ipv6[16];
}; //sizeof(IP) = 20

对于一个IP地址,要么是IPV4要么是IPV6,IPV4和IPV6是互斥的,那么肯定有一块空间是被浪费了。此时我们的union就派上用场了:

union IP
{
	char ipv4[4];
	char ipv6[16];
}; //sizeof(IP) = 16

第二种用法是可以通过union判断大小端。(当然也可以通过其他方法)

union End
{
	unsigned char uc;
	unsigned short us;
};

bool is_little_end()
{
	End end{0};
	end.us = 1;
	return end.uc;
}

小端模式的意思是,低位放在低内存,高位放在高内存。而大端正好相反。当我们给us赋值1时,如果是大端,内存中的数据应该是这样的:0x00,0x01,这时候如果取uc的值,只能取到0x00。如果是小端,内存中的数据应该是0x01,0x00,此时取到的uc的值是0x01,返回1(true)。

小伙伴们,你还知道union的其他用法吗?

关注我,带你21天“精通”C++!(狗头)


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK