知识点
const 有什么用途
主要有三点:
1:定义只读变量,即常量
2:修饰函数的参数和函数的返回值
3: 修饰函数的定义体,这里的函数为类的成员函数,被const修饰的成员函数代表不修改成员变量的值
指针和引用的区别
1:引用是变量的一个别名,内部实现是只读指针
2:引用只能在初始化时被赋值,其他时候值不能被改变,指针的值可以在任何时候被改变
3:引用不能为NULL,指针可以为NULL
4:引用变量内存单元保存的是被引用变量的地址
5:“sizeof 引用” = 指向变量的大小 , “sizeof 指针”= 指针本身的大小
6:引用可以取地址操作,返回的是被引用变量本身所在的内存单元地址
7:引用使用在源代码级相当于普通的变量一样使用,做函数参数时,内部传递的实际是变量地址
关键字static的作用
函数体内 static 变量的作用范围为该函数体,不同于 auto 变量, 该变量的内存只被分配一次,因此其值在下次调用时仍维持上次的值
在模块内的 static 全局变量可以被模块内所有函数访问,但不能被模块外其他函数访问
在模块内的static 函数只可被这一模块内的其他函数调用,这个函数的使用范围被限制在声明它的模块内
在类的static 成员变量属于整个类所拥有,对类的所以对象只有一份拷贝
在类中的 static 成员函数属于整个类所拥有,这个函数不接收 this 指针,因而只能访问类的 static 成员变量
介绍它最重要的一条:隐藏。(static函数,static变量均可) –> 对应上面的2、3项
当同时编译多个文件时,所有未加static前缀的全局变量和函数都具有全局可见性。
编译、链接
include guards (#ifndef…#define….#endif)可以防止头文件多次引用,为何全局变量定义在此,会提示多次定义?
A: (1)include guards 是防止头文件相互包含从而引起循环引用的错误的。
(2)对于全局变量定义在头文件中时,Link阶段,编译器会看见两个a的定义。原因在于 include guards 只在同一个translation unit(一个c文件和include的文件的编译过程)内起作用,两个编译单元是编译过程是分开的,所以无法察觉到另外一个里面的#ifdefine内容。在test.cpp文件中定义一个全局变量,在其他文件中引用时,要 extern 还是include “test.h”
?
A:(1)不需要包含include,只需要extern 就可以了。其实 test.h中也是extern。含义是一样的。
(2)static 函数只能在本文件中调用。
多线程
参考
C++面试集锦( 面试被问到的问题 )
常见C++面试题及基本知识点总结(一)
高级:c++研发面试