【C++ 面试 - 基础题】每日 3 题(八)

✍个人博客:Pandaconda-CSDN博客

📣专栏地址:http://t.csdnimg.cn/fYaBd

📚专栏简介:在这个专栏中,我将会分享 C++ 面试中常见的面试题给大家~
❤️如果有收获的话,欢迎点赞👍收藏📁,您的支持就是我创作的最大动力💪

22. def ine、const、typedef、inline

22.1 c onst 与 #define 的区别:

  1. const 定义的常量是变量带类型,而 #define 定义的只是个常数不带类型;

  2. define 只在预处理阶段起作用,简单的文本替换,而 const 在编译、链接过程中起作用;

  3. define 只是简单的字符串替换没有类型检查。而 const 是有数据类型的,是要进行判断的,可以避免一些低级错误;

  4. define 预处理后,占用代码段空间,const 占用数据段空间;

  5. const 不能重定义,而 define 可以通过 #undef 取消某个符号的定义,进行重定义;

  6. define 独特功能,比如可以用来防止文件重复引用。

 22.2 define 和 const 在内存里是怎么存的?

define 不分配内存,因为是在编译期前替换,const 是在编译时起作用。宏定义的数据没有分配空间,只是插入替换掉;const 定义的变量只是值不能改变,但要分配内存空间。

22.3 #d efine 和别名 typedef 的区别

  1. 执行时间不同,typedef 在编译阶段有效,typedef 有类型检查的功能;#define 是宏定义,发生在预处理阶段,不进行类型检查;

  2. 功能差异,typedef 用来定义类型的别名,定义与平台无关的数据类型,与 struct 的结合使用等。#define 不只是可以为类型取别名,还可以定义常量、变量、编译开关等。

  3. 作用域不同,#define 没有作用域的限制,只要是之前预定义过的宏,在以后的程序中都可以使用。而 typedef 有自己的作用域。

 22.4 #define 与 inline 的区别

  1. #define 是关键字,inline 是函数;

  2. 宏定义在预处理阶段进行文本替换,inline 函数在编译阶段进行替换;

  3. inline 函数有类型检查,相比宏定义比较安全;

 22.5 inline 的作用

内联是以代码膨胀(复制)为代价,仅仅省去了函数调用的开销,从而提高函数的执行效率。 用关键字 inline 放在函数定义的前面即可将函数指定为内联函数,内联函数通常就是将它在程序中的每个调用点上 “内联地” 展开,假设我们将 max 定义为内联函数:

inline int max(int a, int b)
{
    return a > b ? a : b;
}

则调用:cout << max(a, b) << endl; 在编译时展开为:cout << (a > b ? a : b) << endl; 从而消除了把 max写成函数的额外执行开销。

22.6 用  define 实现 MAX 函数

#define MAX(a, b) ((a) > (b) ? (a) : (b))

23. 简 述 #ifdef、#else、#endif 和 #ifndef 的作用

利用 #ifdef、#endif 将某程序功能模块包括进去,以向特定用户提供该功能。在不需要时用户可轻易将其屏蔽。

#ifdef MATH
#include "math.c"
#endif

在子程序前加上标记,以便于追踪和调试。

#ifdef DEBUG
printf ("Indebugging......!");
#endif

应对硬件的限制。由于一些具体应用环境的硬件不一样,限于条件,本地缺乏这种设备,只能绕过硬件,直接写出预期结果。

「注意」:虽然不用条件编译命令而直接用 if 语句也能达到要求,但那样做目标程序长(因为所有语句都编译),运行时间长(因为在程序运行时间对 if 语句进行测试)。而采用条件编译,可以减少被编译的语句,从而减少目标程序的长度,减少运行时间。

24. st rlen 和 sizeof 的区别

  1. sizeof 是一个操作符,strlen 是库函数。

  2. sizeof 的参数可以是数据的类型,也可以是变量,而 strlen 只能以结尾为 ‘\0’ 的字符串作参数。

      strlen 是不将 \0 算进长度中,而 sizeof 会将 \0 算进长度。

      例如 "abcdef",strlen 会计算成 6 而 sizeof 会计算成 7。

  3. 编译器在编译时就计算出了 sizeof 的结果,而 strlen 函数必须在运行时才能计算出来。并且 sizeof 计算的是数据类型占内存的大小,而 strlen 计算的是字符串实际的长度。

  4. 数组做 sizeof 的参数不退化,传递给 strlen 就退化为指针。

      举个例子:  

  对于 64 位的机器来说,输出结果为:     为了避免转换成指针,我们可以以引用的方式传递:

  

  在这个例子中使用了模板函数 printsizeAndLength,它接受一个数组引用作为参数在函数内部,使用 sizeof 计算数组的大小时,数组不会退化为指针。

  引用的作用就在于阻止拷贝的发生,通过传递引用,我们让形参得到和数组名同样的地址。

 

  • 21
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值