C++_嵌入式开发面试题记录
1.Static关键词的作用?
static
关键字有三个主要作用:
- 局部变量:在函数内部,
static
局部变量只初始化一次,且在函数调用结束后仍然保留其值。 - 全局变量/函数:在文件内部,
static
限制全局变量或函数的作用域,使其仅对当前文件可见。 - 类成员:在类中,
static
成员变量或函数属于类本身而非某个对象,可以不通过对象访问。
好的,我将通过三个简短的代码示例来解释 static
关键字的三个主要作用:
1. 局部变量的 static
作用
在函数内部,static
局部变量的值在多次调用中保持不变,并且只初始化一次。
#include <iostream>
void counter() {
static int count = 0; // 只初始化一次
count++;
std::cout << "Count: " << count << std::endl;
}
int main() {
counter(); // 输出 Count: 1
counter(); // 输出 Count: 2
counter(); // 输出 Count: 3
}
解释:count
是静态局部变量,函数多次调用时,它的值得以保留并累加。
2. 全局变量/函数的 static
作用
使用 static
限制全局变量或函数的作用域,使其只能在定义它的源文件中可见。
// file1.cpp
static int hiddenVar = 10; // 只能在 file1.cpp 中访问
static void hiddenFunc() {
std::cout << "This is a static function in file1.cpp" << std::endl;
}
// file2.cpp
// hiddenVar 和 hiddenFunc 在此不可访问
解释:hiddenVar
和 hiddenFunc
只能在 file1.cpp
中使用,file2.cpp
无法访问它们。
3. 类成员的 static
作用
static
类成员属于类本身,而不是某个对象,且所有对象共享这一成员。
#include <iostream>
class MyClass {
public:
static int sharedValue; // 静态成员变量
static void display() { // 静态成员函数
std::cout << "Shared value: " << sharedValue << std::endl;
}
};
int MyClass::sharedValue = 42;
int main() {
MyClass::display(); // 通过类名访问静态成员函数
MyClass obj1, obj2;
obj1.sharedValue = 100;
MyClass::display(); // 输出 Shared value: 100(所有对象共享该值)
}
解释:sharedValue
是类的静态成员,所有 MyClass
对象共享这一个变量。
4.指针常量和常量指针
-
常量指针(Pointer to Constant):指向的值是常量,不能修改这个值,但指针可以指向其他地址。
- 作用:用来保护指向的数据不被修改。
const int* ptr;
-
指针常量(Constant Pointer):指针本身是常量,不能改变指向的地址,但可以修改指向的值。
- 作用:用来确保指针始终指向同一地址。
int* const ptr;
typedef和define有什么区别?
typedef
用于定义类型别名,遵循编译器检查;#define
是预处理宏替换,直接文本替换,无类型检查。
4.野指针是什么
没有初始化的指针,他被随机指向内存中的一块位置
5. C语言中内存分配的方式有几种?
(a)静态存储区分配
内存分配在程序编译之前完成,且在程序的整个运行期间都存在,例如全局变量、静态变量等
(b)栈上分配
在函数执行时,函数内的局部变量的存储单元在栈上创建,函数执行结束时这些存储单元自动释放局部变量、函数内参数都在栈上
(c) 堆上分配
New开辟的空间在堆上
6.说一说指针的理解,二级指针,三级指针等,对函数指针的理解等。
由于c中存在着内存管理的概念,所以指针应运而生,指针是存储内存地址的变量,二级、三级指针分别存储指针的地址,函数指针存储函数的地址并可用于调用函数。
7.简单说说extern、static、const、voliate的作用
extern
用于声明外部变量或函数,static
用于定义静态变量,比如函数内的局部静态变量,以及限制作用域的全局静态变量,防止其他文件读取,const
定义不可修改的常量,可以用于定义常量、定义常量指针、常量形参等,volatile
避免编译器优化,直接从内存地址读数据而不是寄存器。
8.简单说说指针的运用场景。
1.动态内存管理
2.函数参数传递
3.数组和字符串操作
4.一些数据结构会用到如链表
9.C++11的语法
10.Linux常用指令
常用Linux指令有:
ls
列出目录内容cd
切换目录pwd
显示当前路径cp
复制文件/目录mv
移动或重命名文件/目录rm
删除文件/目录cat
查看文件内容grep
搜索文本chmod
修改权限ps
查看进程top
实时监控系统资源df
查看磁盘使用情况du
查看文件/目录大小ssh
远程登录tar
打包或解包文件
11.简单说说SQL优化和索引结构
SQL优化主要通过减少查询时间和资源消耗实现,常见方法包括:合理使用索引、避免全表扫描、减少子查询、使用连接代替嵌套查询等。
索引结构常见的有两种:
- B+树索引:用于快速查找范围查询、排序,适合大部分场景。
- 哈希索引:用于精确匹配查询,但不支持范围查询。
索引能加快查询速度,但要避免过多索引影响写操作性能。
12. 简单说说多线程
C++多线程通过标准库中的<thread>
实现,允许并发执行多个线程。常用功能包括:
std::thread
:创建和管理线程。- 同步机制:使用
mutex
、lock
、condition_variable
等避免数据竞争和死锁,确保线程安全。 join
与detach
:join
让主线程等待子线程完成,detach
使线程独立执行。- 线程池:可以通过
async
或第三方库创建线程池,提升并发效率。
多线程用于加速计算、处理I/O密集型任务、或实现并行数据处理。
13. 简单说说重写和重载
重写(Override)是子类重新定义父类的虚函数,保持函数签名一致,实现多态。
重载(Overload)是同一作用域内定义多个同名函数,通过不同参数类型或数量区分调用。
14.说说C++中的虚函数和纯虚函数
虚函数是通过virtual
关键字声明的函数,允许子类重写以实现运行时多态。调用时根据对象的实际类型选择合适的函数版本。
纯虚函数(= 0
)是没有实现的虚函数,要求子类必须重写,声明类为抽象类,不能直接实例化。
15. 一个程序从开始运行到结束的完整过程(四个过程)
预处理(Pre-Processing)、编译(Compiling)、汇编(Assembling)、链接(Linking)
16. 计算机中,32bit与64bit有什么区别
64bit计算主要有两大优点:可以进行更大范围的整数运算;可以支持更大的内存寻址。
17. Linux 操作系统关机、重启相关命令
关机:shutdown now 或 poweroff
重启:reboot 或 shutdown -r now
取消关机:shutdown -c
1、改变文件属性的命令:chmod (chmod 777 /etc/squid 运行命令后,squid文件夹(目录)的权限就被修改为777(可读可写可执行))
2、查找文件中匹配字符串的命令:grep
3、查找当前目录:pwd
4、删除目录:rm -rf 目录名
5、删除文件:rm 文件名
6、创建目录(文件夹):mkdir
7、创建文件:touch
8、vi和vim 文件名也可以创建
9、解压:tar -xzvf 压缩包
打包:tar -cvzf 目录(文件夹)
18.说一个linux下编译优化选项:
加:-o
原文地址:https://blog.csdn.net/qq_39969848/article/details/142831792
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!