一.简介
又要准备面试啦,每年换工作都要问一些关于基础的C++的基础题,简直烦死我了。网上一搜不是一大堆嘛,真要开发碰到情况,肯定到时候会处理。
迫于无奈,整理一下吧,免得到时候很尴尬。。。
二.C++原理题
1.C++是面向对象的程序设计
2.面向对象的四大特性:封装 抽象 继承 多态
3.C++由三大部分组成:核心语法(变量 数据类型 常量等) C++标准库(提供函数) 标准模板库(STL)(用于处理复杂的数据)
那么问题来了,别人一般考你C++,要么考你基础的语法,要么考你对C++标准库里面的函数是否清楚,要么考你对标准模板库里面的容器是否熟悉
1.C++基础的语法
(1)各种语言都有自己符号特定的含义,C++也不例外,那么最先学习的是C++各种符号使用的含义
详情参考我写的博客中C++的符号系列
(2)各种语言也都有自己变量独特的定义方式,C++也不例外,但是有些变量被征用了,那就是C++的关键字或者内置的数据类型
详情参考我写的博客中C++的变量系列
(3)各种语言也都有自己函数创建和使用的方式,C++也不例外
详情参考我写的博客中C++的函数系列
(4)C++独特之处在于它有对象和类的概念,起源要从它被创建的用处开始讲起
详情参考我写的博客中C++的对象和类系列
2.C++标准库
C++标准库提供了一些专门处理不同开发的函数,这样就不用自己再写了
这里只列举一些比较常见和常用到的C++标准库,比如处理文件和流、处理多线程等
详情参考我写的博客中C++的标准库系列
3.C++标准模板库
C++标准模板库(STL)由三部分组成:容器(Containers) 算法(Algorithms) 迭代器(iterators)
详情参考我写的博客中C++的STL(标准模板库)系列
三.C++开发题
平时我们除了用C++自己的库之外,也可能用到C++其他的开源库来辅助开发,别人肯定会问你用到哪些C++的开源库呀
四.C++算法题
五.C++改错题
1.GetMemory 考内存
项目 ->属性 -> c/c++ -> 预处理器 -> 点击预处理器定义,编辑,加入_CRT_SECURE_NO_WARNINGS
(1) Geometry1
无法运行
报错:
0x00007FFBF79C9E5D (ucrtbased.dll)处(位于 test.exe 中)引发的异常: 0xC0000005: 写入位置 0x0000000000000000 时发生访问冲突。
最关键的在于指针通过函数参数来传递,编译器把指针参数拷贝了一个副本,虽然副本开辟了内存,但是参数没有返回,所以原来的指针没有发生改变,所以还是空指针
void GetMemory(char* p)
{
p = (char*) malloc(100);
}
void Test(void)
{
char* str = NULL;
GetMemory(str);
strcpy(str, "hello world");
printf(str);
}
(2) Geometry2
可以运行,输出hello,但是内存泄漏
因为传递的是指针的指针,虽然指针拷贝,但是指针的指针同时指向同一片内存,所以内存有发生改变
主要是malloc开辟的动态内存,没有回收,所以会导致内存泄漏,它不是栈内存,系统不负责回收。
void GetMemory(char** p, int num)
{
*p = (char*) malloc(num);
}
void Test(void)
{
char* str = NULL;
GetMemory(&str, 100);
strcpy(str, "hello");
printf(str);
}
(3) Geometry3
可以运行,但输出一大堆 烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫
主要因为局部变量存储在栈上,指针虽然返回,但是指针指向的内存在栈上被释放,所以最后的指针将指向未知内存位置,一般都为烫
char* GetMemory(void)
{
char p[] = "hello world";
return p;
}
void Test(void)
{
char* str = NULL;
str = GetMemory();
printf(str);
}
(4) Geometry4
可以运行,输出hello
由于char p[]数据内存是在栈上的,而char* p 指针并不开辟内存,指向了常量区,所以内存没有被系统回收,可以输出
char* GetMemory(void)
{
//char* p = (char*)("hello");
char p[] = "hello";
return p;
}
void Test(void)
{
char* str = NULL;
str = GetMemory();
printf(str);
}
(5) Geometry5
可以运行,输出hello
常量区不曾被修改
char* GetMemory(void)
{
return (char*)("hello");
}
(6)野指针
正确版本
char* getMemory(int num) { char *p = (char*)malloc(num);//在堆区申请的空间,记得释放哦..... return p; } int main(int argc, char ** argv) { char* str = getMemory(100); //返回的是堆空间,需要手动释放 strcpy(str, "hello world!"); printf("%s ",str); free(str); //内存释放 str = NULL; //不加这句会产生野指针哦 return 0; }