C++八股文
–学习笔记主要参考编程指北的博客
1.sizeof()和strlen()
(1)sizeof关键字
sizeof是一个关键字,而非函数,其会在编译期间计算数据类型或者对象所占用的字节数,其主要的关键点如下:
指针的大小永远是固定的,取决于处理器位数,32位就是 4 字节,64位就是 8 字节。
数组作为函数参数时会退化为指针,大小要按指针的计算。
struct 结构体要考虑字节对齐,字节对齐的具体规则请看这篇文章,总体就是按照成员变量占用的最大空间计算。
字符串数组要算上末尾的 ‘\0’,因此sizeof得到的字符串长度是定义的长度加1,例如“hello world!”,其使用sizeof会显示长度为12,而strlen长度为11。
(2)strlen()函数
注意,strlen是一个系统自带的函数,而不是关键词,与sizeof有着本质上的区别。
例如在函数中,如果使用数组作为参数传入,其会退化为指针,此时使用sizeof会得到指针的大小,而使用strlen则会得到数组的长度。
2.const关键词
const,即constant,可以理解为常量,意为不可修改,在C++中也有着类似的含义,用于修饰相关数据类型,表示对应的数据不能修改,具体的,可以分为以下几种情况:
(1)修饰变量
意味着该变量无法进行修改,注意仅仅在编译层面实现。
(2)修饰函数参数
意味着在该函数内部,该参数不能修改,多用于引用和指针作为参数传入的情况。
(3)修饰函数返回值
意味着该返回这不能被修改,实际用到的情况不多,记住此时的函数不能作为左值。
(4)修饰指针
const修饰指针可以说是最为复杂的情况之一,其实搞懂以下几个选项的不同就行:
- const int *p
- int const *p
- int *const p
- const int * const p
(5)修饰成员函数
该函数不能对非static或者mutable修饰的成员变量进行修改,同时函数中不能够调用其他非const类型的成员函数(否则在这些函数中,成员变量也有可能被修改)。
注意,写法应该是int func() const{},而非const int func(){}
3.static关键词
static,意为静态,相较于const比较抽象,静态可以理解为其所占用的内存空间是静态的,其使用场景如下:
(1)修饰全局变量:
该变量仅仅在本文件中生效,其他文件中不能通过extern关键词对其进行声明。
(2)修饰局部变量:
该变量不会随着其作用域的消失而释放内存,其会一直保存对应的数值。
(3)修饰普通函数:
与全局变量,这样会导致该函数仅仅在本文件中生效,无法被其他文件引用,这样可以避免文件之间的命名冲突。
(4)修饰成员函数与成员变量:
使得该成员变量或者函数在所有对象之间共享,同时,调用该成员变量或者函数时,不需要实例化对象,可以直接通过class::func()的方式进行调用(当然也可以通过对象+.func()的方式进行调用)。
特别注意:当需要初始化静态成员变量时,
- 如果时普通静态成员变量,如static int a,需要在类外对其进行初始化,如
- 如果是常量静态成员变量,则需要在声明时对其进行初始化,如