cpp面试题合集

面试题合集

  1. 下面两个函数能形成函数重载吗?有问题吗或者什么情况下会出问题?
void TestFunc(int a = 10) {
 	cout<<"void TestFunc(int)"<<endl; 
}
void TestFunc(int a) {
	 cout<<"void TestFunc(int)"<<endl; 
}

我的答案:在这里插入图片描述
不能形参函数重载。函数重载在同一作用域下,函数同名而参数列表不同。而参数列表中形参列表(参数个数 或 类型 或 顺序)必须不同。据此分析参数个数,类型,顺序都是一样的,虽然有缺省值但是并不影响。点开错误C2084可用看到:说明该函数已经被定义过了,这两个函数重复定义了,因为没有重载成功所以导致重复定义,因而使得编译失败。
在这里插入图片描述
在这里插入图片描述
2. C语言中为什么不能支持函数重载?

我的答案:

​ 因为在C语言中,编译过程中的函数名改写机制比较简单,在函数前面只是添加了一个下划线,例如_main,而函数重载是函数同名而形参列表不同,编译后的同名函数都是 _函数名,这时候就使得函数不唯一了,因此会导致报错。所以C语言不支持函数重载。

3.C++中函数重载底层是怎么处理的?

  1. 如何解决命名冲突?

    命名机制讲一个重载函数的签名映射到一个新的标识。映射为:作用域+返回类型+函数名+参数列表

  2. 如何解析?

    重载函数的调用匹配:

    • 精确匹配:参数匹配而不做转换,或者只是做微不足道的转换,如数组名到指针、函数名到指向函数的指针、T到const T;
    • 提升匹配:即整数提升(如bool 到 int、char到int、short 到int),float到double
    • 使用标准转换匹配:如int 到double、double到int、double到long double、Derived到Base、T到void、int到unsigned int;
    • 使用用户自定义匹配
    • 使用省略号匹配:类似printf中省略号参数

    解析重载函数的调用:

    • 根据函数名确定候选函数集
    • 从候选函数集中选择可用函数集合
    • 从可用函数集中确定最佳函数,或由于模凌两可返回错误
  3. C++中能否将一个函数按照C的风格来编译?

能,在函数前面使用extern”C“,就能告诉编译器,这个函数按照C语言规则来编译。


问题:宏的优缺点?

优点:

1.增强代码的复用性。

2.提高性能。

缺点:

1.不方便调试宏。(因为预编译阶段进行了替换)

2.导致代码可读性差,可维护性差,容易误用。

3.没有类型安全的检查 。

问题:C++有哪些技术替代宏

  1. 常量定义 换用const

  2. 函数定义 换用内联函数


问题:C++中struc和class的区别是什么?

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


问题:在类和对象阶段,我们只研究类的封装特性,那什么是封装呢?

封装:将数据和操作数据的方法进行有机结合,隐藏对象的属性和实现细节,仅对外公开接口来和对象进行交互。

封装本质上是一种管理:我们如何管理兵马俑呢?比如如果什么都不管,兵马俑就被随意破坏了。那么我们首先建了一座房子把兵马俑给封装起来。但是我们目的全封装起来,不让别人看。所以我们开放了售票通道,可以买票突破封装在合理的监管机制下进去参观。类也是一样,我们使用类数据和方法都封装到一下。不想给别人看到的,我们使用protected/private把成员封装起来。开放一些共有的成员函数对成员合理的访问。所以封装本质是一种管理。


问题:

  1. 结构体怎么对齐? 为什么要进行内存对齐

(1)使用结构体对齐规则

  1. 第一个成员在与结构体偏移量为0的地址处。

  2. 其他成员变量要对齐到某个数字(对齐数)的整数倍的地址处。

注意:对齐数 = 编译器默认的一个对齐数 与 该成员大小的较小值。VS中默认的对齐数为8,gcc中的对齐数为4

  1. 结构体总大小为:最大对齐数(所有变量类型最大者与默认对齐参数取最小)的整数倍。

  2. 如果嵌套了结构体的情况,嵌套的结构体对齐到自己的最大对齐数的整数倍处,结构体的整体大小就是所有最大对齐数(含嵌套结构体的对齐数)的整数倍。

  3. 在内存中,编译器按照成员列表顺序分别为每个结构体变量成员分配内存,当存储过程中需要满足边界对齐的 要求时,编译器会在成员之间留下额外的内存空间。如果想确认结构体占多少存储空间,则使用关键字sizeof

  4. 当#pragma pack的n值等于或超过所有数据成员长度的时候,这个n值的大小将不产生任何效果。当我们将#pragma pack的n值小于所有数据成员长度的时候,结果将改变。

(2)

  • 平台原因(移植原因)

    • 不是所有的硬件平台都能访问任意地址上的任意数据的;
    • 某些硬件平台只能在某些地址处取某些特定类型的数据,否则抛出硬件异常。
  • 性能原因:

    • 数据结构(尤其是栈)应该尽可能地在自然边界上对齐。
    • 原因在于,为了访问未对齐的内存,处理器需要作两次内存访问;而对齐的内存访问仅需要一次访问。提高访存速度。
  1. 如何让结构体按照指定的对齐参数进行对齐

  2. 如何知道结构体中某个成员相对于结构体起始位置的偏移量

如果想得知结构体的某个特定成员在结构体的位置,则使用offsetof宏(定义于stddef.h)。

int offset_b = offsetof(struct m, a);// 获得成员a相对于结构体m储存地址的偏移量
  1. 什么是大小端?如何测试某台机器是大端还是小端,有没有遇到过要考虑大小端的场景

(1)

计算机从低位字节开始存放,低字节放在低地址——小端(little-endian)

计算机从高位字节开始存放,高字节放在低地址——大端(big-endian)(大端和我们从左到右的阅读习惯一致)

big endian:    0x11223344 -> |0x11|0x22|0x33|0x44|
little endian: 0x11223344 -> |0x44|0x33|0x22|0x11|

在这里插入图片描述

(2)

  • 用lscpu命令可以获得大小端信息。
  • 直接读取存在在内存的十六进制数,取低位进行值判断
int a = 0x12345678;
int *c = &a;
c[0] == 0x12   //大端模式
c[0] == 0x78   //小段模式

(3)


待续。。。

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
当谈到C++中的随机数面试题时,以下是一些常见的问题和答案: 问题1:如何在C++中生成随机数? 答案:在C++中,可以使用标准库中的`<random>`头文件来生成随机数。通常使用以下步骤: - 创建一个随机数引擎对象,如`std::default_random_engine`。 - 选择合适的随机数分布,如均匀分布`std::uniform_int_distribution`或正态分布`std::normal_distribution`。 - 使用随机数引擎和随机数分布来生成随机数。 问题2:如何生成一个范围在[min, max]之间的随机整数? 答案:可以使用`std::uniform_int_distribution`来实现。以下是一个示例代码: ```cpp #include <iostream> #include <random> int main() { int min = 1; int max = 10; std::random_device rd; std::default_random_engine engine(rd()); std::uniform_int_distribution<int> distribution(min, max); int randomNum = distribution(engine); std::cout << "Random number: " << randomNum << std::endl; return 0; } ``` 问题3:如何生成一个范围在[0, 1)之间的随机浮点数? 答案:可以使用`std::uniform_real_distribution`来实现。以下是一个示例代码: ```cpp #include <iostream> #include <random> int main() { std::random_device rd; std::default_random_engine engine(rd()); std::uniform_real_distribution<double> distribution(0.0, 1.0); double randomNum = distribution(engine); std::cout << "Random number: " << randomNum << std::endl; return 0; } ``` 这些是一些常见的C++随机数面试题,希望对你有所帮助!如有更多问题,请随时提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值