• 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;
    }
  • 相关阅读:
    129 01 Android 零基础入门 02 Java面向对象 06 Java单例模式 03 饿汉模式 VS 懒汉模式 02 懒汉式的代码实现
    128 01 Android 零基础入门 02 Java面向对象 06 Java单例模式 03 饿汉模式 VS 懒汉模式 01 饿汉式的代码实现
    127 01 Android 零基础入门 02 Java面向对象 06 Java单例模式 02 单例模式概述 01 单例模式的定义和作用
    126 01 Android 零基础入门 02 Java面向对象 06 Java单例模式 01 设计模式概述 01 设计模式简介
    125 01 Android 零基础入门 02 Java面向对象 05 Java继承(下)05 Java继承(下)总结 01 Java继承(下)知识点总结
    leetcode-----121. 买卖股票的最佳时机
    leetcode-----104. 二叉树的最大深度
    Json串的字段如果和类中字段不一致,如何映射、转换?
    Mybatis-Plus的Service方法使用 之 泛型方法default <V> List<V> listObjs(Function<? super Object, V> mapper)
    模糊查询
  • 原文地址:https://www.cnblogs.com/k5bg/p/12019760.html
Copyright © 2020-2023  润新知