宏的优缺点
优点:
1.增强代码的复用性
2.提高性能
缺点:
1.不方便调试宏(因为预编译阶段进行了替换)
2.导致代码可读性变差,可维护性差,容易误用
3.没有类型安全的检查
C++中有哪些方法代替宏?
1.常量定义,换用const
2.函数定义换用内联函数
交换函数的两种方式
传值:传参效率低,不能通过形参改变实参,函数副作用不影响外部实参
传指:传参效率高,可以通过形参改变实参,不安全,指针需要判空,可读性较差
引用和指针的不同点 :
- 引用在定义时必须初始化,指针没有要求
- 引用在初始化时引用一个实体后,就不能再引用其他实体,而指针可以在任何时候指向任何一个同类型 实体
- 没有NULL引用,但有NULL指针
- 在sizeof中含义不同:引用结果为引用类型的大小,但指针始终是地址空间所占字节个数(32位平台下占 4个字节)
- 引用自加即引用的实体增加1,指针自加即指针向后偏移一个类型的大小
- 有多级指针,但是没有多级引用
- 访问实体方式不同,指针需要显式解引用,引用编译器自己处理
- 引用比指针使用起来相对更安全
【面试题】
问题:C++中struct和class的区别是什么?
解答:C++需要兼容C语言,所以C++中struct可以当成结构体去使用。另外C++中struct还可以用来定义类。 和class是定义类是一样的,区别是struct的成员默认访问方式是public,class是struct的成员默认访问方式 是private
strlen和sizeof的区别
- strlen 是函数,sizeof 是运算符。
- strlen 测量的是字符的实际长度,以’\0’ 结束。而sizeof 测量的是字符的分配大小。
- 但是在子函数中,ziseof 会把从主函数中传进来的字符数组当作是指针来处理。指针的大小又是由机器来决定,而不是人为的来决定的。
- strlen函数求的是字符串的实际长度,它求得方法是从开始到遇到第一个’\0’,如果你只定义没有给它赋初值,这个结果是不定的,它会从首地址一直找下去,直到遇到’\0’停止。
- strlen的结果要在运行的时候才能计算出来,是用来计算字符串的长度,不是类型占内存的大小。而大部分编译程序在编译的时候就把sizeof计算过了是类型或是变量的长度。
- sizeof可以用类型做参数,strlen只能用char*做参数,且必须是以’’\0’'结尾的。
结构体内存对齐规则
1.第一个成员在与结构体偏移量为0的地址处
2.其他成员变量要对齐到对齐数的整数倍的地址处
3.对齐数=编译器默认对齐数与该成员大小的较小值
VS默认的对齐数为8,gcc为4
4.如果嵌套了结构体的情况,嵌套的结构体对齐到自己的最大对齐数的整数倍处,结构体整体大小就是所有最大对齐数(含嵌套结构体的对齐数的整数倍)
为什么要存在内存对齐?
是用空间换时间的做法
malloc和new的区别
1.申请内存的区域不同
malloc是从堆上申请内存
new也可以说是在堆上申请内存,但是严格意义上来讲,他是分配在自由存储区(free store)上的
(ps:自由存储区是C++中通过new和delete动态分配和释放对象的抽象概念,通过new申请的内存区域可以成为自由存储区)
2.返回值类型不同
malloc返回的是void* ,需要强制类型转换成所需要的类型
new返回的是对象类型的指针,类型严格与对象匹配,无需强制类型转换
3.内存分配失败时返回值不同
malloc失败时返回NULL,所以一般使用malloc时判断是否申请成功,判断返回值是否为NULL
new失败时会抛出bac_alloc异常
4.是否需要指定内存大小
malloc需要显式指定要申请的内存大小
A* ptr=(A*)malloc(sizeof (A));
new不需要指定,编译器会自动分配大小
A* ptr=new A;
5.是否会调用构造函数和析构函数
malloc不会调用
new会调用:
先调用operator new 分配内存
构造
返回指向该对象的指针