首页 > 编程语言 >C++面试八股文:struct、class和union有哪些区别?

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

时间:2023-06-04 18:01:46浏览次数:46  
标签:struct union IP C++ char 内存 class

某日小二参加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++!(狗头)

标签:struct,union,IP,C++,char,内存,class
From: https://www.cnblogs.com/binarch/p/17456011.html

相关文章

  • Effective Modern C++(二)完美转发与移动语义
     移动语义使编译器有可能用廉价的移动操作来代替昂贵的拷贝操作。正如拷贝构造函数和拷贝赋值操作符给了你控制拷贝语义的权力,移动构造函数和移动赋值操作符也给了你控制移动语义的权力。移动语义也允许创建只可移动(move-only)的类型,例如std::unique_ptr,std::future和std::threa......
  • C++ chrono
    std::ratio表示一个单位时间。template<std::intmax_tNum,std::intmax_tDenom=1>classratio;Num是时间的分子,Denom是时间的分母。std::milli=std::ratio<1,1000>std::centi=std::<1,100>std::deci=std::<1,10>std::chrono::duration......
  • C++ java 启动器
    #include<Windows.h>#include<stdlib.h>#include<string>intWINAPIWinMain(HINSTANCEhInstance,HINSTANCEhPrevInstance,LPSTRlpCmdLine,intnShowCmd){//设置环境变量java_homestd::wstringjava_home=L"D:\\Tools\\jdk\......
  • 使用vue出现Uncaught TypeError: Vue is not a constructor错误
    原因是vue2和vue3写法不对正确是<!DOCTYPEhtml><html>   <head>      <metacharset="utf-8">      <title></title>      <scripttype="text/javascript"src="https://unpkg.com/vue@next"></s......
  • c++函数调用压栈过程
    c++函数调用,栈内情况如下图所示:首先主函数将被调函数所需参数从右至左压入栈中然后再将主函数地址即返回地址EIP压入栈中再将主函数栈基址EBP压入栈中,此时构造被调函数栈,将当前ESP值mov给EBP,即被调函数栈从此处开始上图ida反汇编代码,可以看到对变量的使用,参数(argc,argv,env......
  • C++面试八股文:指针占用多少个字节?
    某日小二参加XXX科技公司的C++工程师开发岗位4面:面试官:memset、memcpy和strcpy的区别是什么?小二:memset用于将一块内存设置为特定的值,memcpy用于将一块内存从一个位置复制到另一个位置,strcpy用于将一个字符串从一个位置复制到另一个位置。面试官:嗯,不错。那么你知道这三个函......
  • c++ explicit关键字
    explicit关键字用于修饰单参数构造函数(因为无参数构造函数和多参数构造函数总是显式调用,这种情况在构造函数前面加explicit毫无意义)和转换函数,用于禁止隐式类型转换作用是防止编译器在某些情况下自动执行隐式类型转换,以提高代码的明确性和安全性classA{public:A(int......
  • c++进行map数据横向合并
    请帮我写一段代码。nlohmann::json怎么把三个字典合并到一起,c++14标准,并且每个字典的长度不一样,原数据不是json。例如:data1=[{"key1":"a1","key2":1},{"key1":"a2","key2":2}]data2=[{"key3":"b1",},{"key3&......
  • c++ volatile关键字
    volatile是关键字,用来修饰变量作用禁止编译器对变量的优化编译器在优化代码时,会对变量的读取和写入进行优化,例如将变量从内存加载到寄存器中进行操作,以提高执行效率,但是对于volatile修饰的变量,编译器不能进行这些优化,以确保对变量的每次读写操作都是直接从内存中进行的一......
  • c++ 左值和右值以及左值引用和右值引用
    无法令引用重新绑定到另一个对象上,因此引用必须初始化,引用并非对象,只是为一个已经存在的对象所起的另外一个名字因为引用本身不是一个对象,所以不能定义引用的引用inta=10;int&b=a;int&c=b;//此时c不是引用的引用,而是bc都是a的引用判断某个表达式是左值还......