某日小二參加XXX科技公司的C++工程師開發崗位5面: > 面試官:struct和class有什麼區別? > > 小二:在C++中,struct和class的唯一區別是預設的訪問控制。struct預設的成員是public的,而class的預設成員是private的。 > > 面試官:struct、c ...
某日小二參加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++!(狗頭)