C++ 初阶总复习 (31~45)
- 目的
- 31. 2037. C++中函数模板和类模板的区别
- 32. 2039. C++中strcpy和memcpy的区别
- 33. 2041. 堆内存和栈内存的区别
- 34. 2042. 栈溢出是什么?
- 35. 2043.回调函数
- 36. 2044. C++中为什么使用nullptr而不使用null
- 37. 2045. 什么是大端序 什么是小端序
- 38. 2046. C++中的include<> 和include " " 有什么区别
- 39. 2047. C++中是否可以include源文件
- 40. 2048. 什么是深拷贝 什么是浅拷贝
- 41. 2049.C++中的命名空间有什么用
- 42. 2050.C++中的友元类和友元函数有什么作用
- 43. 2051.C++中如何涉及一个线程安全的类
- 44. 2052. C++如何调用C语言的库
- 45. 指针和引用的区别
目的
写这一系列文章的目的主要是为了秋招时候应对计算机基础问题能够流畅的回答出来 (如果不整理下 磕磕绊绊的回答会被认为是不熟悉)
本文章题目的主要来源来自于 面试鸭
部分面试鸭上没有而牛客网上有的博主会进行查缺补漏
题目编号按照面试鸭官网题号方便大家寻找
题解大部分是博主根据自己之前的博客再加上部分网上的内容进行口语化的表述 如果涉及到省略的部分博主会提供自己或者其他人的博客链接
题目会按照由简单到难进行更新
31. 2037. C++中函数模板和类模板的区别
参考博客
模板进阶
回答
他们的主要区别在于实例化方式和用法上
- 在使用函数模板的时候 我们无需实例化 直接传入参数即可
- 在使用类模板 我们需要显示的声明模板类型
此外函数模板在使用时实例化 类模板在显示指定时实例化
什么是非类型模板参数
非类型模板参数是使用常量作为模板的一个参数
我们可以用它来指定静态数组的大小
32. 2039. C++中strcpy和memcpy的区别
回答
他们的主要区别是
- strcpy主要是用于字符串之间的拷贝 它以
/0
作为终止位置 - memcpy能够拷贝任意类型的数据
33. 2041. 堆内存和栈内存的区别
回答
他们之前的区别主要在于下面几个方面
- 地址增长 栈向下增长 堆向上增长
- 生命周期 堆的声明周期如果不主动释放 一直到程序结束 栈的生命周期则随着作用域的消失而结束
- 性能 栈的性能要优于堆的性能
- 管理方式 栈由编译器自动管理 而堆由程序员手动管理
34. 2042. 栈溢出是什么?
参考博客
函数栈帧
回答
从上面的博客中我们可以知道 当我们每次函数调用的时候都会开辟出一块新的栈空间出来
但是栈空间肯定不是无限的啊
如果说我们写了一个无限递归的函数 或者说递归次数很多的函数 栈空间承受不住了 就会出现栈溢出的现象
35. 2043.回调函数
指针进阶
回调函数是通过函数指针或者函数对象将一个函数作为参数传递给另一个函数的机制
它让我们能够优化代码 解耦
并且实现异步编程 让我们的主程序不必停留
36. 2044. C++中为什么使用nullptr而不使用null
参考博客
C++11的新特性
回答
因为在C语言中 NULL即是0 比如说我们设置重载函数 一个参数是int 一个参数是in *
如果输入的是NULL 那么我们是期望出现哪种结果呢?
所以说为了解决这个问题 我们就引入了nullptr 这样就不会出现歧义了
37. 2045. 什么是大端序 什么是小端序
参考博客
大端法和小端法
大端法就是数据的高字节保存在低地址中
小端法就是数据的低字节保存在地址中
比如说一个数字 0x 12 34 56 78
12 34 56 78 这就是大端 反之则是小端
38. 2046. C++中的include<> 和include " " 有什么区别
include是包含头文件
使用尖括号是从系统执行的路径中寻找头文件
而使用 ” “则是从当前路径下寻找 或者是从以当前路径为起点的相对路径中寻找
39. 2047. C++中是否可以include源文件
回答
可以 因为include的本质实际上就是将其他文件内的所有数据展开到当前文件下 (这里可以联系到预处理的作用 ) 在预处理阶段生效
40. 2048. 什么是深拷贝 什么是浅拷贝
参考博客
深拷贝和浅拷贝
回答
浅拷贝主要是只是简单的拷贝数值 不考虑对象管理的空间资源 比如说对象其实用指针管理者一块内存 如果使用浅拷贝 它就只会把指针的地址拷贝下
而深拷贝则会创建出一块和原来内存一样大的新内存出来
41. 2049.C++中的命名空间有什么用
参考博客
初识C++
回答
命名空间主要是用来解决命名冲突的问题 当我们的一个项目较大的时候难免会出现命名冲突的现象 如果出现了这样的现象就会出现编译不过的问题
此时我们就只需要定义一个命名空间就可以了
42. 2050.C++中的友元类和友元函数有什么作用
参考博客
友元函数
作用
主要是允许函数和类访问当前类的私有和保护的成员变量 (注意不能使用函数)
使用场景 当我们要使用多个类的私有成员的时候
class Box; // 前向声明class Item {
private:int weight;
public:friend int calculateTotalWeight(const Item&, const Box&);
};class Box {
private:int boxWeight;
public:friend int calculateTotalWeight(const Item&, const Box&);
};// 友元函数可以访问 Item 和 Box 的私有成员
int calculateTotalWeight(const Item& i, const Box& b) {return i.weight + b.boxWeight;
}
43. 2051.C++中如何涉及一个线程安全的类
参考博客
C++多线程相关
回答
涉及到线程安全我们就需要加锁了 在涉及临界资源的时候加锁 在最后接锁即可
void func(int n , int& x)
{for (int i = 0; i < n; i++){mtx.lock();cout << this_thread::get_id() << " : " << i << endl;x++;mtx.unlock();}}int main()
{int x = 0;thread t1 = thread(func, 10, ref(x));thread t2 = thread(func, 10, ref(x));t1.join();t2.join();cout << x << endl;return 0;
}
44. 2052. C++如何调用C语言的库
回答
主要有下面集中方式
- extern “C”
- 修改makefile文件 g++ 变成gcc
- 修改文件的后缀.cpp变成.c
45. 指针和引用的区别
参考博客
初识C++
回答
- 引用的底层是指针
- 引用必须要初始化 而指针可以不初始化
- 引用不能指空 但是指针可以指向nullptr
- 引用被创建后不能被修改 但是指针可以修改