乐清人才网官方网站,网上卖货有哪些免费平台,最好永久免费素材网,做一个网站成本是多少C面试题总结 一、C基础二、类与继承、多态三、C11新特性 一、C基础
1. C和C的区别 1. C面向过程#xff0c;C面向对象#xff0c;所以C具有封装、继承、多态三大特性#xff1b;#xff08;多态的基础是封装和继承#xff0c;即通过虚函数继承父类的方法#xff0c;实现… C面试题总结 一、C基础二、类与继承、多态三、C11新特性 一、C基础
1. C和C的区别 1. C面向过程C面向对象所以C具有封装、继承、多态三大特性多态的基础是封装和继承即通过虚函数继承父类的方法实现接口的重复调用 2. C可以用STL标准库包含vector、map、set、文件输入输出等 3. C中存在命名空间的概念支持运算符重载支持异常处理增加程序的可靠性和容错性。
2. 数组和指针的区别 1.数组名本质上是指向数组首个元素的指针指针就是指向对象的地址 2.数组名一般不能修改指针可以修改而指向其他对象 3.数组名的大小一般是数组元素的个数x单个元素的大小指针大小和系统有关32位系统一般是4字节64位系统一般是8字节。
3. 引用和指针的区别 1.是别名没有内存分配指针是地址需要分配内存保存 2.引用在创建的时候已经构建完成指针可以先创建后赋值 3.有多级指针指向指针的指针但是没有多级引用 4.引用和指针的自增运算结果不同。
4. 内联函数inline和普通函数之间的区别 内联函数在编译时直接编译到主函数中不存在函数调用的开销普通函数在函数调用时需要进行函数栈的出栈和入栈操作。因此对于本身比较简单且调用次数很多的函数可以采用内联函数的形式。
5. 常量指针const int* p和指针常量int* const p之间的区别 常量指针const int* p 是指向常量的指针不能改变常量的值但是指向常量的指针地址可以修改 指针常量int * const p 地址不可以修改但是值可以修改。
6. 如何避免野指针 1.使用前初始化 2.使用后及时释放 3.不重复释放指针 4.不使用悬空指针超出作用域或者已经删除的指针。
7. 堆heap和栈stack的区别 1.内存分配方式不同堆通常是程序员手动分配和释放的常用于程序中需要动态分配的内容如动态数组等栈通常由程序自动创建和释放通常用于存放临时变量 2.内存管理方式不同堆通常是由程序员分配和释放栈遵循后进先出原则由系统自动完成 3.内存大小堆相对比较大栈相对比较小通常只有几百KB到几MB的大小 4.访问速度堆需要考虑多线程并发时的同步与互斥问题速度相对较慢栈由系统自动分配与释放访问相对较快 5.应用场景堆适用于动态数组等需要动态分配与管理的数据结构栈适用于临时变量与函数的存储与管理。
8.关键词extern的作用 1.共享全局变量如a.cpp中定义int golbal 1在b.cpp中通过extern int golbal调用 2.相对于include头文件的方式extern通常可以提升编译速度因为不需要额外编译除当前extern的函数之外的无关函数。
9.减少内存泄漏的方法 1.malloc和freenew和delete要对应 2.注意指针指向对象的大小避免指针越界如数组 3.动态分配内存的指针最好不要二次赋值 4.对指针赋值时注意被赋值指针需要不需要释放 5.在C中优先考虑使用智能指针。
10.malloc free和new delete之间的区别 1.malloc free是C语言的malloc需要指定内存的大小new delete是C的new不需要指定大小 2.malloc只负责分配内存并返回内存的首地址不会初始化new在分配内存空间后同时完成初始化 3.malloc返回的是void需要进行强制类型转换new返回目标对象的指针 4.malloc失败时会返回NULL需要手动释放new失败时会抛出异常; 5.free是直接释放内存块delete是调用析构函数进行内存释放。
11.RAII RAIIResource Acquisition Is Initialization资源获取即初始化机制是一种对资源申请、释放这种成对的操作的封装是么 通过这种方式实现在局部作用域内申请资源然后销毁资源
12.volatile的作用 volatile和const相反表示不稳定的每次使用改变量需要从内存中重新读取在多线程都要用到同一个变量且该变量会被改变时经常用到。
8.关键词extern的作用
二、类与继承、多态
1. 基类的析构函数为什么要定义为虚函数 如果基类的析构函数不是虚函数那么通过基类的指针删除派生类的对象时无法正确调用派生类的析构函数无法正确析构对象导致内存泄漏和其他未定义行为。 构造函数不能是虚函数虚函数需要通过虚函数表进行查找如果构造函数为虚函数没有构造对象之前没有虚函数表相互矛盾。 纯虚函数一般是基类中的函数没有实现是空函数 抽象类有纯虚函数的类就是抽象类不能被实例化。
2. 构造函数的调用顺序 基类的构造函数-初始化成员变量-派生类的构造函数。
3. overload重载、overwrite重定义、override覆盖之间的区别 1.overload重载即函数名相同参数类型或者参数数量不同。特例a.只有返回值不同的两个函数不属于overload重载如int f(int a)和float f(int a)b.const函数与原函数属于重载函数如inf f(int a)和int f(int a) const。 2. override覆盖虚函数继承基类函数以关键词virtual修饰 3. overwrite重定义在函数继承中用到重定义基类的函数。 overload、override、overwrite总结
拷贝构造函数 拷贝构造函数在哪几种情况下会被调用? 1.当类的一个对象去初始化该类的另一个对象时 2.如果函数的形参是类的对象调用函数进行形参和实参结合时 3.如果函数的返回值是类对象函数调用完成返回时。 什么时候必须重写拷贝构造函数? 答当构造函数涉及到动态存储分配空间时要自己写拷贝构造函数并且要深拷贝。 深拷贝浅拷贝
三、C11新特性
1. auto和decltype 如果基类的析构函
参考文献 C面试必备常见C面试题汇总及详细解析