面试题总结

宏的优缺点
优点:
1.增强代码的复用性
2.提高性能
缺点:
1.不方便调试宏(因为预编译阶段进行了替换)
2.导致代码可读性变差,可维护性差,容易误用
3.没有类型安全的检查
C++中有哪些方法代替宏?
1.常量定义,换用const
2.函数定义换用内联函数

交换函数的两种方式
传值:传参效率低,不能通过形参改变实参,函数副作用不影响外部实参
传指:传参效率高,可以通过形参改变实参,不安全,指针需要判空,可读性较差
引用和指针的不同点 :

  1. 引用在定义时必须初始化,指针没有要求
  2. 引用在初始化时引用一个实体后,就不能再引用其他实体,而指针可以在任何时候指向任何一个同类型 实体
  3. 没有NULL引用,但有NULL指针
  4. 在sizeof中含义不同:引用结果为引用类型的大小,但指针始终是地址空间所占字节个数(32位平台下占 4个字节)
  5. 引用自加即引用的实体增加1,指针自加即指针向后偏移一个类型的大小
  6. 有多级指针,但是没有多级引用
  7. 访问实体方式不同,指针需要显式解引用,引用编译器自己处理
  8. 引用比指针使用起来相对更安全

【面试题】
问题:C++中struct和class的区别是什么?
解答:C++需要兼容C语言,所以C++中struct可以当成结构体去使用。另外C++中struct还可以用来定义类。 和class是定义类是一样的,区别是struct的成员默认访问方式是public,class是struct的成员默认访问方式 是private

strlen和sizeof的区别

  1. strlen 是函数,sizeof 是运算符。
  2. strlen 测量的是字符的实际长度,以’\0’ 结束。而sizeof 测量的是字符的分配大小。
  3. 但是在子函数中,ziseof 会把从主函数中传进来的字符数组当作是指针来处理。指针的大小又是由机器来决定,而不是人为的来决定的。
  4. strlen函数求的是字符串的实际长度,它求得方法是从开始到遇到第一个’\0’,如果你只定义没有给它赋初值,这个结果是不定的,它会从首地址一直找下去,直到遇到’\0’停止。
  5. strlen的结果要在运行的时候才能计算出来,是用来计算字符串的长度,不是类型占内存的大小。而大部分编译程序在编译的时候就把sizeof计算过了是类型或是变量的长度。
  6. 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 分配内存
构造
返回指向该对象的指针

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值