整理的C++笔试面试基础-01
一、基本数据类型:
- bool char int float double void wchar_t(来源:typedef short int wchar_t, wchar实际上的空间是和short int 一样)
- 并且可以采用以下修饰符修饰:signed、unsigned(无符号, 范围就变成从0开始)、short、long。
二、typedef
为一个已有的类型取一个新的名字 。
例如:
typedef int feet;
feet是int的另外一个名字也,也就是可以使用如下方式来代替int进行定义。
feet distacnce;
三、enum (枚举类型)
例如:
enum color { red, green, blue } c;
c = blue; //变量c类型为color
四、extern关键字
-
简单的解释:用于声明一个全局变量或者函数,并指示它在其他文件中定义,extern声明不是定义,不分配存储空间。
extern的两种用法:
-
声明全局变量:在一个文件中使用extern声明一个变量,告诉编译器该变量在其他文件中定义,这样在该文件中就可以使用该变量而不需要再进行定义。
// 文件a.cpp
extern int globalVar; // 声明全局变量globalVar
// 文件b.cpp
int globalVar = 10; // 定义全局变量globalVar,并赋初值为10
- 声明全局函数:在一个文件中使用extern声明一个函数,告诉编译器该函数在其他文件中定义,这样在该文件中就可以使用该函数而不需要再进行定义。
// 文件a.cpp
extern void func(); // 声明全局函数func
// 文件b.cpp
void func() { // 定义全局函数func
// 函数体
五、变量的定义和声明区别
变量的定义为变量分配地址和存储空间,而声明并不分配地址。一个变量的谁声明可以在多个地方声明,但是只能在一个地方定义。
六、左值与右值
前者是指指向内存位置的表达式,可以出现在赋值号的左边或右边;后者指的是存储在某些地址的数值,可以出现在赋值号的右边,但是不能出现在左边。
七、常量
- 整数常量可以使十进制、八进制或十六进制的常量,定义常量的方式有两种:使用#define预处理器以及const关键字。
- #define和const的区别:前者不分配内存,后者分配内存;前者是宏定义,相当于字符替换,后者是常量声明;前者无类型安全检查,后者有;前者存储在代码段中,后者存储在数据段中;前者可以通过#undef取消,后者不可取消。
八、引用与指针的区别:
- 不存在空引用,引用必须连接到一块合法的内存;
- 一旦引用被初始化为一个对象,就不能被指向到另一个对象;指针可以在任何时候指向到另一个对象;也就是说指针可以被重新赋值,而引用不行;
- 引用必须在创建时被初始化。指针可以在任何时间被初始化;
- 指针可以进行算术运算,而引用不能。
九、虚函数与纯虚函数
-
虚函数:基类中使用关键字 virtual 声明的函数,可以在基类中有默认的实现方式,并且在子类也可以选择性地覆盖其实现。
-
纯虚函数:没有默认的实现,必须在派生类中实现。
-
虚函数可以被调用,而纯虚函数不能直接被调用,必须在派生类中实现才能被调用。
十、多态
- 概念:指的是同一个函数在不同的对象上有不同的行为,简单来说就是通过基类的指针或者引用来调用派生类的同名函数,实现不同的行为。
- 弊端:多态需要在运行时候动态地确定函数调用,增加了运行时候的开销,代码的可读性也会下降。
- 解决方法:减少虚函数的调用次数,简化继承关系,减少代码复杂度。
十一、指针数组与数组指针
- 指针数组:本质上是数组,数组中的元素都是指针类型,举个栗子:
nt main(){
int num1= 1, num2 = 2, num3 = 3;
int *ptr_arr[3]; //定义指针数组
ptr_arr[0] = &num1; //将地址值放到指针数组当中
ptr_arr[1] = &num2;
ptr_arr[2] = &num3;
for (int i = 0; i < 3; i++) {
printf("ptr_arr[%d] = %p, *ptr_arr[%d] = %d\n", i, ptr_arr[i], i, *ptr_arr[i]); //这个%p是指针的打印类型
}
return 0;
}
- 数组指针:本质上是一个指针,其指向数组,可以通过指针访问数组中的元素,注意这里指针是指向数组中的首地址的。
十二、内联函数
- 一种特殊的函数,在调用时候并不通过函数调用机制而是通过函数体直接插入调用出处来实现,可以减少函数调用的开销。
- 使用方法:直接在函数前加inline关键字。
- 缺点:内联函数的函数体不能太大,编译器可能会自动放弃内联方式。