C++常见的10个问题合集解释

1、struct和union的区别
Struct和union都由多个不同类型的数据组成,但是union只能存放一个成员,而struct的所有成员都存在,struct的每个成员都占有自己的内存空间,它们是同时存在的,struct变量的大小等于所有成员大小之和。
而在union中所有成员不能同时存在,任一时刻只能保存一个值。Union变量的大小等于最大成员的大小,对不同进行赋值将会修改变量的内存。
2、static的作用解释
【C++常见的10个问题合集解释】Static修饰局部变量时:变量储存在静态存储区中,只能初始化一次,而且不能使用变量初始化,修饰任意类型的变量,其有效期都是在程序生命周期中有效。
Static修饰全局变量时:存储在静态储存区中,未经初始化的变量被自动初始化为0.
Static修饰类成员:被类的所有对象共享,包括派生类,static成员变量必须在类外部进行初始化,如int class::var=10; ,不能再构造函数内部进行初始化,但是可以使用const修饰static成员在内部初始化。
3、对C++ const的理解
Const有以下几种用法:

  • Const int *p或int const *p:修饰指针指向的内存,表示该内存不可修改。
  • Int * const p:修饰该指针,表示该指针的值不可修改。
  • Cont int a:表示a是一个常量。
  • Void mfunc() const {}:mfunc是一个类成员函数,表示在该函数中不能修改类成员变量。
4、vector中size()和capacity()的区别
size()指容器当前拥有的元素个数(对应的resize(size_type)会在容器尾添加或删除一些元素,来调整容器中实际的内容,使容器达到指定的大小。);capacity()指容器在必须分配存储空间之前可以存储的元素总数。
5、new、delete、malloc、free关系
delete会调用对象的析构函数,和new对应free只会释放内存,new调用构造函数。malloc与free是C++/C语言的标准库函数,new/delete是C++的运算符。它们都可用于申请动态内存和释放内存。对于非内部数据类型的对象而言,光用maloc/free无法满足动态对象的要求。对象在创建的同时要自动执行构造函数,对象在消亡之前要自动执行析构函数。由于malloc/free是库函数而不是运算符,不在编译器控制权限之内,不能够把执行构造函数和析构函数的任务强加于malloc/free。因此C++语言需要一个能完成动态内存分配和初始化工作的运算符new,以及一个能完成清理与释放内存工作的运算符delete。注意new/delete不是库函数。
6、delete与 delete []区别
delete只会调用一次析构函数,而delete[]会调用每一个成员的析构函数。在More Effective C++中有更为详细的解释:“当delete操作符用于数组时,它为每个数组元素调用析构函数,然后调用operator delete来释放内存。”delete与new配套,delete []与new []配套
7、什么是虚函数?什么是纯虚函数?
虚函数是允许被其子类重新定义的成员函数。
虚函数的声明:virtual returntype func(parameter); 引入虚函数的目的是为了动态绑定;
纯虚函数声明:virtual returntype func(parameter)=0;引入纯虚函数是为了派生接口。(使派生类仅仅只是继承函数的接口)
8、指针和引用的区别
本质上的区别是,指针是一个新的变量,只是这个变量存储的是另一个变量的地址,我们通过访问这个地址来修改变量。
而引用只是一个别名,还是变量本身。对引用进行的任何操作就是对变量本身进行操作,因此以达到修改变量的目的。
9、内联函数与普通函数的区别
1)内联函数和普通函数的参数传递机制相同,但是编译器会在每处调用内联函数的地方将内联函数内容展开,这样既避免了函数调用的开销又没有宏机制的缺陷。
2)普通函数在被调用的时候,系统首先要到函数的入口地址去执行函数体,执行完成之后再回到函数调用的地方继续执行,函数始终只有一个复制。
内联函数不需要寻址,当执行到内联函数的时候,将此函数展开,如果程序中有N次调用了内联函数则会有N次展开函数代码。
3)内联函数有一定的限制,内联函数体要求代码简单,不能包含复杂的结构控制语句。如果内联函数函数体过于复杂,编译器将自动把内联函数当成普通函数来执行。
10、C++ STL是什么,有什么用?
在已有 C++ 尤其是 C++ 模板的基础上,从本节开始,我们开始系统地学习 STL 标准模板库,首先来了解什么是 STL,以及学习 STL 有什么用?
STL,英文全称 standard template library,中文可译为标准模板库或者泛型库,其包含有大量的模板类和模板函数,是 C++ 提供的一个基础模板的集合,用于完成诸如输入/输出、数学计算等功能。
STL 最初由惠普实验室开发,于 1998 年被定为国际标准,正式成为 C++ 程序库的重要组成部分。值得一提的是,如今 STL 已完全被内置到支持 C++ 的编译器中,无需额外安装,这可能也是 STL 被广泛使用的原因之一。
STL 就位于各个 C++ 的头文件中,即它并非以二进制代码的形式提供,而是以源代码的形式提供。
从根本上说,STL 是一些容器、算法和其他一些组件的集合,所有容器和算法都是总结了几十年来算法和数据结构的研究成果,汇集了许多计算机专家学者经验的基础上实现的,因此可以说,STL 基本上达到了各种存储方法和相关算法的高度优化。
注意,这里提到的容器,本质上就是封装有数据结构的模板类,例如 list、vector、set、map 等,有关这些容器的具体用法,后续章节会做详细介绍。

    推荐阅读