(1) sizeof
- 在32位系统下,各类型所占字节数
sizeof(char) = 1
sizeof(short) = 2
sizeof(int) = 4
sizeof(unsigned int) = 4
sizeof(long) = 4
sizeof(long long) = 8
sizeof(float) = 4
sizeof(double) = 8
- 数组的大小
char buf[3];
sizeof(buf) = 3;
wchar_t wbuf[3];
sizeof(buf) = 6;
- 数组作为函数参数时的大小
int getSize(char buf[]) {
return sizeof(buf);
}
int main() {
char buf[3];
printf("%d", getSize(buf)); // 数组作为参数时,退化为指针,在32位系统上指针占4字节
}
- 引用的大小
int main()
{
char a = 'A';
char &b = a;
printf("%d", sizeof(b)); // `sizeof(引用)`得到的是引用的变量的大小,char占1各字节,故结果为1
return 0;
}
(2) 运算符优先级
- 运算符的优先级
- 记忆口诀
括号成员第一; //括号运算符[]() 成员运算符. ->
全体单目第二; //所有的单目运算符比如++、 --、 +(正)、 -(负) 、指针运算*、&
乘除余三,加减四; //这个"余"是指取余运算即%
移位五,关系六; //移位运算符:<< >> ,关系:> < >= <= 等
等于(与)不等排第七; // == 和 !=
位与异或和位或; //位运算: 位与(&) 异或(^) 位或(|)
"三分天下"八九十;
逻辑或跟与; //逻辑运算符:|| 和 &&
十二和十一; //注意顺序:优先级(||) 底于 优先级(&&)
条件高于赋值, //三目运算符优先级排到13 位只比赋值运算符和","高
逗号运算级最低! //逗号运算符优先级最低
- 相关内容
int *p[3]; // 指针数组
int (*p)[3]; // 数组指针
*p++; // 先p++, 后取值
(3) 内存对齐
参考文章:《彻底理解内存对齐》
(4) C++各种类型转换函数
参考文章:《C++ 类型转换》
(5) strcpy
char *strcpy(char* dest, const char *src);
strcpy
函数不对传入参数的有效性进行检查(如是否为NULL),若dest
或src
为空,程序会引发空指针异常而崩溃。strcpy
函数会拷贝src
的内容到dest
,直到遇到'\0'
为止,并且会将'\0'
拷贝到dest
。strcpy
函数返回dest
指针。
(6) 指针与引用的区别
- 引用必须在定义的时候进行初始化。如果是成员变量的引用类型,则必须通过构造函数初始化列表来初始化。
- 引用一经初始化之后,不能修改;而指针可以修改,重新指向其他变量。
- 因为引用不可变,所以没有必要用const修饰(视编译器不同,有的会产生警告,有的会产生编译错误);而指针有const,const的指针不可变
- 指针可以为NULL,而引用不能。
- 指针归根到底是一个变量,存储的是变量地址;而引用则是变量的一个别名,是指针的弱化版本。
sizeof(指针)
得到的是指针的大小,而sizeof(引用)
得到的是引用的变量的大小。
(7) free
free
函数会对参数是否为NULL
进行校验,所以free(NULL);
不会引发程序崩溃。
(8) C++内存分配方式
C++的内存分配分为:堆、栈、全局/静态存储区、常量存储区。
堆
:由程序员分配和释放,若程序员未释放,则在程序结束时由操作系统释放。堆是向着内存地址增加的方向生长。
栈
:由编译器自动分配和释放,主要存储函数参数,局部变量等。栈是向着内存地址减少的方向生长。
全局/静态存储区
:存储全局变量和静态变量。初始化的和未初始化的全局/静态变量分开存储。
常量存储区
:存储程序中的常量。
(9)C++虚函数表
(10)class与struct的区别
- class的默认访问级别是private;而struct得默认访问级别是public。
- C语言中的struct不能有成员函数,而C++中的struct可以有成员函数,甚至可以有虚函数。
(11)为什么拷贝构造函数的参数要为常引用?
分解开来解释:
1. 为什么要是引用?因为如果为传值的方式的话,会再次引发拷贝构造,这个会一直循环递归下去。
2. 为什么要是常引用?防止成员的值被修改。
(12)const与宏的区别
- const有数据类型,而宏没有数据类型。
- 编译器会对前者进行类型安全检查,而宏只是单纯的字符串替换。
(13)STL容器的实现方式
vector
:通过数组来实现。vector
每次扩容时,会扩大为当前需要容量的2倍。map
:通过红黑树来实现。查找非常快,查找算法复杂度为 log2n l o g 2 nlist
:通过链表来实现。
(14)const用法
归纳为一句话就是:const永远是修饰它前面的内容。但有个例外就是const在最前面时,如const int *p;
,等同于int const *p;
。
(15)static的作用
- 在函数体内,static变量只在第一次进入函数体内时被初始化。该变量存储在静态存储区。
- 在模块(源文件)内,被声明为static的函数只在该模块(源文件)内可见。
- 在模块(源文件)内,被声明为static的全局变量只在该模块(源文件)内可见。
- 在类内,被声明为static的成员变量必须在类的外部初始化,不属于类的任何对象,被整个类所拥有。
- 在类内,被声明为static的成员函数,不属于类的任何对象,被整个类所拥有,可以访问类的static成员变量。