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

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

时间:2023-06-10 23:56:37浏览次数:42  
标签:struct union IP C++ char 内存 class

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)。

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

相关文章

  • [C/C++] 结构体
    在C语言中,字符串实际上是使用空字符\0结尾的一维字符数组。因此,\0是用于标记字符串的结束。固定缓冲区#defineMAX_LEN100#defineDATA_LEN100typedefstruct{intlength;chardata[MAX_LEN];//固定缓冲区大小,浪费内存}max_buffer,*max_buffer_ptr;......
  • 《C++》--C转C++基础1
    变量类型、关键字变量类型:shortintlongdoublefloatcharbool输出cout<<""<<endl;#include<iostream>#include<string>usingnamespacestd;intmain(){ charstr1[]="Hello"; stringstr2="World";//string创建字符串......
  • C++ 指针
    一、C++指针的算术运算递增一个指针我们喜欢在程序中使用指针代替数组,因为变量指针可以递增,而数组不能递增,因为数组是一个常量指针。下面的程序递增变量指针,以便顺序访问数组中的每一个元素:实例#include<iostream>usingnamespacestd;constintMAX=3;intmain()......
  • 第十四届蓝桥杯大赛软件赛国赛 C/C++ 大学 A 组
    Preface蓝桥杯战俘闪总出列!逆天比赛早上9点要赶到六七公里外的其它学校,因此早上7点就起来了然后坐公交颠着颠着就到了成都工业学院的门口,还刚好看到了lyy佬,就一起溜去考场了到了考场看了一圈好多熟悉的面孔,应该都是集训队的学长啥的,但好多名字还是叫不出来然后好像8点半就能......
  • 探究C#中Class和Struct互相嵌套的内存问题
    内存分区先回顾一下C#的内存种类栈区:由编译器自动分配释放,存放值类型的对象本身,引用类型的引用地址(指针),静态区对象的引用地址(指针),常量区对象的引用地址(指针)等。其操作方式类似于数据结构中的栈。堆区(托管堆):用于存放引用类型对象本身。在c#中由.net平台的垃圾回收机制(GC)管......
  • C++的多线程编程(练习一下condition_variable)
        嗯,高考结束了,那就编写一个阅卷和查成绩的多线程吧。一个线程老师阅卷,其他三个线程查成绩。代码如下:    1#include<iostream>2#include<thread>3#include<mutex>4#include<condition_variable>5#include<chrono>6#include<futu......
  • C++基础题
    C++基础题水仙花数#include<iostream>usingnamespacestd;intmain(){cout<<"3位水仙花数:"<<endl;for(intnum=100;num<=999;num++){intdigit1=num/100;//百位数字intdigit2=(num/10)%10;......
  • c++中static的用法
    1、静态全局变量全局变量的空间会在程序的生命周期内分配,在全局变量的前面加上static,变成静态全局变量。#include<iostream>#include<string.h>usingnamespacestd;staticintn=5;intmain(){n=10;printf("%d\n",n);return0;}静态全局变量......
  • C++面试八股文:指针占用多少个字节?
    C++面试八股文:指针占用多少个字节?某日小二参加XXX科技公司的C++工程师开发岗位4面:面试官:memset、memcpy和strcpy的区别是什么?小二:memset用于将一块内存设置为特定的值,memcpy用于将一块内存从一个位置复制到另一个位置,strcpy用于将一个字符串从一个位置复制到另一个位......
  • 【基础算法】关于高精度计算的问题【很高位数数据的加减乘除(相关代码用C++实现)】
    前言当我们在利用计算机进行一些计算时,可能会遇到这类问题:有些计算要求精度高,希望计算的数的位数可达几十位甚至几百位,虽然计算机的计算精度也算较高了,但因受到硬件的限制,往往达不到实际问题所要求的精度。这时我们就可以通过程序设计来解决这类问题,例如:<fontcolor=red>创建......