C/C++基础详解(二)
1.C++中struct与class区别
相同点:
1.都是用来定义类对象的
2.都有成员函数和成员变量,都有权限设置不同点:
1.默认权限不同,class默认是private权限,struct由于要兼容C,默认是public权限
2.继承上:class默认是私有继承,struct默认是public继承补充:
C++中struct与C中struct区别:
1.C中无权限设置,C++中存在权限设置
2.C中struct中只能放变量,不能定义函数,C++中都可以做到
3.C++中struct能继承,能实现多态,C不能
2.define与const区别
1.define在预处理阶段进行,const在编译和运行时起作用
2.define只是进行宏替换,在代码中可能存在多份代码,const修饰只在程序中有一份备份
3.define不做类型检查,const要进行类型检测
4.define是用来进行宏替换的,不进行空间开辟,而const修饰的变量是需要分配空间的
3.const与static作用
static:
1.static修饰的全局变量和函数作用域限定到当前文件,而未被修饰的全局变量和函数是可以在其他文件中访问的,外部使用需要extern声明
2.在C++中类成员变量被static修饰,定义必须在类外,定义时可以不加static,储存在全局数据区,权限不改变
3.C++类成员函数被static修饰,该函数无法直接访问类中非成员函数和对象,无需要实例化类对象即可调用,无this指针---指针常量const:
1.const修饰变量必须初始化
2.const修饰的形参可以接受非const修饰和const修饰的变量
3.const修饰类变量是不能在类外部初始化,必须在类中调用构造函数初始化
4.const修饰类函数时,该函数无法访问非const修饰的函数和变量
5.const修饰的变量和函数也将作用域限定到当前文件
4.内联函数和宏区别
1.宏不进行类型检测,内联函数要进行类型检测
2.宏书写过于麻烦,通常要判断是否加括号,内联只需要直接使用即可
3.宏在预处理阶段进行替换,内联函数在编译时将函数代码嵌入目标代码中
5.大小端:
大小端详解-CSDN博客
6.malloc/free是如何分配空间的?
malloc、free这些都是函数,而非系统调用,因此实际是需要系统调用接口来实现的
首先,malloc优先去内存池中申请空间,如果满足就返回地址,否则就去堆上申请
当申请的空间大小<128K时,利用brk系统调用,使堆从低地址向高地址上升,开辟一块满足的空间
当申请的空间大小>=128时,利用mmap系统调用,在堆栈之间找到一块满足大小的空间开辟,直接映射匿名内存页free:
<128KB时,即是利用brk系统调用分配的空间,free释放不会立即归还给操作系统,而是被放入 glibc 的内存池供后续空间申请时使用,只有当堆顶的连续空闲内存超过一定大小时,才会通过 brk 收缩堆空间
>=128KB时,即通过mmap系统调用分配的空间,free释放时会立即归还给操作系统,不会留在内存池中
7.说说C++四种强制类型转换方式及其使用场景
1.static_cast<T>()
所有可以隐式类型转换的可以使用其,适用于非多态类型转换2.reinterpret_cast<T>()
使用于不同类型的转换,例如int类型转换为指针,int* p = reinterpret_cast<int*>(a);3.const_cast<T>()
适用于消除const属性的强制类型转换4.dynamic_cast<T>()
适用于父类向子类进行转换,前提是父类必须有虚函数
8.移动构造函数
在拷贝构造中,假设a拷贝一份代码给b,b复制一份后,a就不再使用,存在时间成本消耗,那么如果直接将a的空间给b,这就是移动拷贝;
相比于构造函数,通常需要采用深拷贝,但是在移动构造中,利用指针指向a的空间即可,只需要保证原来指向该空间的指针指向nullptr,防止重复析构即可
相比于拷贝构造使用的是左值,移动构造使用的是将亡值或右值,这也说明了移动构造使用场景,当然也可以通过std::move来实现左值到将亡值的转换
9.C++中临时变量转为返回值返回时是如何处理的?
当一个临时变量作为返回值返回时,函数结束时该临时变量就会销毁,此时根据返回值来判断其存放的位置:
16 位 存放在 ax 寄存器中
32 位 存放在 eax寄存器中
64 位 edx存放高32位,eax存放低32位
10.在传递参数的过程中,引用传递和指针传递的区别?
1.指针传递本质上是值传递,传递的是目标值,通过在被调函数创建一个临时指针指向目标地址(形参)
2.引用传递传递的是实参的地址,对形参的操作都是间接改变实参情况
3.在底层上来讲,指针和引用都会放在一个符号表中,但是不同的是,指针在符号表中放的是指针变量的地址值,而引用存放点是引用对象的地址值
补充知识:
符号表创建之后就不会发生改变,因此这也是为什么指针可以改变指向的原因,在符号表中存放的是指针地址,而不是其指向的内容地址,引用无法改变指向,因为其指向的地址被符号表确定了
以上就是这次的内容,感谢你的支持!!!