C++
为简单的叙述
IDE
如下图所示,从VS中创建空项目后,会出现如下结构
但是要注意,Header Files、Resource Files、Source Files实质上只是过滤器,并不真正存在于磁盘中,仅仅存在于这个解决方案资源管理器视图中。
那么该怎么显示真实的磁盘的目录结构?
如图所示,点击红框选中的Show All Files
基于文件组织,我们需要手动创建一个文件夹,例如src,存储我们的头文件以及源代码文件等。
以及修改项目设置,将输出的.exe文件以及中间文件以合理的方式组织。
如图,右键蓝色高亮的项目
并在出现的一系列选项中选择红色框选的Properties
将原先的
改为
引用
创建的引用并不是一个真正实际存在于内存中的变量。
它只是在我们的源代码中出现,相当于一个实际存在的变量的别名。
但我们通过改变引用,也会改变它实际引用的变量。反之亦然。
由于C++函数参数是值传递的,实际上会复制拷贝创建一个新的变量。通过引用,我们可以使得真正改变该变量。
引用更是一个语法糖,使得代码更加得干净。然而引用能做的,指针必然也能做。
声明一个引用时,必须进行初始化。并且我们不能改变它,0不能又引用为另一个变量,即成为另一个变量的别名。
类
简单而言,类就是数据和功能进行组合的方式。
C++类中,默认情况下,类中所有数据都是私有的。
类不会给任何新的功能,即不能用类搞定的事情,用类也绝对搞不定。
本质也是一个语法糖,基于面向对象的思想,用于组织我们的代码。
结构
类与结构技术上的区别,在于结构默认的是public。
结构体存在的原因在于,为了和C保持兼容性。
结构体和类的差异就是这么微不足道,仅仅取决于编程风格。
静态
static
一种在类/结构体外使用的static
一种在类/结构体内使用的static
对于声明变量,简单而言:
类外的static,意味着声明为static的符号,链接将只是在内部,只对定义它的翻译单元可见
而类内使用static,代表该变量将与类的所有实例共享内存。
具体看类外的static:
链接器不会在该作用域之外寻找,即这些静态变量以及静态方法只能在被声明的文件中“可见”。
如果在头文件声明一个静态变量
局部静态static:
并不局限于函数,但表示仅在该作用域。即在局部作用域使用static
构造函数
创建实例时进行的初始化方法。
特殊类型方法,每次构造一个对象时都会调用。
Log() = delete表示不需要使用构造函数
析构函数
在销毁对象时进行,调用析构函数,进行内存清理等。适用于栈对象与堆对象。
析构函数意义在于当构造函数调用了特定的初始化代码后,我们希望在析构函数中销毁这些东西,否则可能会造成内存泄漏。
比如在堆上分配的对象,手动分配了任何类型的内存都需要进行手动清理。
虚函数
允许我们在子类中重写方法。
因为调用方法时,会在该类内部寻找方法。
而基于多态性的表述,我们希望父类指针指向子类对象时,能够在子类中进行寻找。
虚函数构建了一个V表,表达了虚函数映射。
C++11中,我们在重载的函数后写上override,这更具可读性,并且避免一些书写错误。
虚函数具有运行时成本:即额外内存存储V表,基类会有一个成员指针指向V表。
并且使用虚函数时,我们会遍历V表,造成额外的性能损失。
但一般而言,带来的性能损失可以接受。