zoukankan      html  css  js  c++  java
  • 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
    ",str);
        free(str);    //内存释放
        str = NULL; //不加这句会产生野指针哦
    
        return 0;
    }
  • 相关阅读:
    faster-RCNN框架之rpn 较小目标检测,如果只使用rpn,并减少多个候选框
    git clone Failed to connect to 127.0.0.1 port 43213: Connection refused
    chrome不能浏览任何网页,提示配置proxy,Ubuntu
    Ubuntu16下用virtualbox 安装Windows虚拟机
    mobilenet之Depthwise +Pointwise
    联想电脑t450,t460p,t470等安装好ubuntu后启动找不到系统
    tensorflow-serving-gpu 本地编译并使用
    git克隆远程仓库的时候断电了,使用git-fetch断点续传
    java ->Servlet接口
    java ->Tomcat服务器
  • 原文地址:https://www.cnblogs.com/k5bg/p/12019760.html
Copyright © 2011-2022 走看看