类是对某个对象的定义。它包含有关对象动作方式的信息,包括它的名称、方法、属性和事件
1>C语言和C++中struct的区别
1>C语言中:struct不能有函数成员,而C++的struct可以有.(C++中的struct能继承,能实现多态)。
2>C中struct是没有权限的设置的,C++中,struct的成员默认访问说明符为public(为了与C兼容)也可以自己设置访问权限,class中的默认访问限定符为private
3>在C里面实际上数据类型为 (struct XX) ,所以定义一个结构XX变量都要 带上struct. 而在C++里面实际上数据类型为XX(主要是因为结构体被当成类对待了),所以定义变量不需要 struct.
2>C++中struct和class的区别
在标准C++中
a>struct成员默认的是public, C++默认private。
b>在用模版的时候只能写template <class Type>或template <typename Type>不能写template <struct Type>
3>什么是封装?如何实现封装特性
a>封装就是隐藏了对象的属性和实现的细节,仅把接口暴露与对象进行交互,将数据和操作方法结合
4>C++如何实现封装特性?
类+访问限定符
5>如何在类外访问一个类中的私有成员变量?
(1)通过公共函数为私有成员
(2)利用指针huoz或者引用访问私有数据成员
(3)通过友元
6>类的对象模型
一个类的大小,实际就是该类中"非静态成员"之和,这里注意内存对齐,注意空类的大小(vs底下是1,因为要实列化对象,就要
有独一无二的地址)
在没有#pragma pack宏的情况下,vs编译器默认的对齐树是8,而gcc中默认的是4
7>结构体内存对齐
1>为什么要进行内存对齐?
因为cpu对内存的读取操作是对齐的,如果x的地址不是4的倍数,那么读取这个x,需要读取两次共8个字节,
然后还要将其拼接成一个int,这比存取对齐过的x要麻烦很多。
CPU把内存当成是一块一块的,块的大小可以是2,4,8,16字节大小,因此CPU在读取内存时是一块一块进行 读取的
2>如何知道结构体中某个成员相对于结构体起始位置的偏移量size_t offsetof( structName, memberName ); #define offsetof(s,m) (size_t) &(((s*)0)->m) 因为类的基值0,所以m的地址就是其在结构体中的偏移地址 &(((s*)0)->m) (s*)0:是骗编译器说有一个指向类(或者结构体)s的指针,它的值是0 &(((s*)0)->m)这个是取结构体中s的成员m
3>什么是大小端?
大端模式,是指数据的高字节保存在内存的低地址中,而数据的低字节保存在内存的高地址中
这样的存储模式有点儿类似于把数据当作字符串顺序处理:地址由小向大增加,而数据从高位往低位放;
这和我们的阅读习惯一致。
小端模式,是指数据的高字节保存在内存的高地址中,而数据的低字节保存在内存的低地址中
这种存储模式将地址的高低和数据位权有效地结合起来,高地址部分权值高,低地址部分权值低。short int x;//2个字节 short int x;//2个字节 char x0, x1; x = 0x1122; x0 = ((char*)&x)[0]; //低地址单元 x1 = ((char*)&x)[1]; //高地址单元 printf("%p\n",x0); printf("%p\n", x1); 若x0=0x11,则是大端; 若x0=0x22,则是小端...
大小端场景?
在网络上传输数据时,由于数据传输的两端可能对应不同的硬件平台,采用的存储字节顺序也可能不一致,
因此 TCP/IP 协议规定了在网络上必须采用网络字节顺序(也就是大端模式).
网络字节顺序是TCP/IP中规定好的一种数据表示格式,它与具体的CPU类型、操作系统等无关,从而可以
保证数据在不同主机之间传输时能够被正确解释。网络字节顺序采用big endian排序方式。
主机字节序就是我们平常说的大端和小端模式:不同的 CPU 有不同的字节序类型,这些字节序是指整数
在内存中保存的顺序 这个叫做主机序。函数原型定义在netinet/in.h里
unsigned short int htons(unsigned short int hostshort):
主机字节顺序转换成网络字节顺序,对无符号短型进行操作4bytes
unsigned long int htonl(unsigned long int hostlong):
主机字节顺序转换成网络字节顺序,对无符号长型进行操作8bytes
unsigned short int ntohs(unsigned short int netshort):
网络字节顺序转换成主机字节顺序,对无符号短型进行操作4bytes
unsigned long int ntohl(unsigned long int netlong):
网络字节顺序转换成主机字节顺序,对无符号长型进行操作8bytes