C++面试题

一.简介

又要准备面试啦,每年换工作都要问一些关于基础的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\n",str);
    free(str);    //内存释放
    str = NULL; //不加这句会产生野指针哦

    return 0;
}

 

posted @ 2019-12-10 22:58  言午丶  阅读(224)  评论(0编辑  收藏  举报