Interview_C++_day1
\(static\) 关键字的作用
- 全局静态变量:在全局变量前加上 \(static\),该变量作用域从定义该变量开始到文件尾结束。存储在静态存储区中。
- 如果 \(static\) 修饰的全局变量在 \(h\) 文件中,则其他文件也可以访问。如果在其他 \(h\) 中操作该变量,该变量会被真实改变。而在其他 \(cpp\) 中操作该变量,该变量的变化只在当前文件有效,虽然他们有着相同的初始内容,但是存储的物理地址却不一样。
- 局部静态变量:在局部变量前加上 \(static\),该变量作用域只在该语句块或函数内。存储在静态存储区中。
- 静态函数:函数默认都是 \(extern\) 类型的,在工程内声明某个函数,若其他 \(cpp\) 文件中同名函数,则会引起冲突。在函数前加上 \(static\) 可以保证该函数只被该 \(cpp\) 文件可用。
- 类的静态成员(函数):在类成员(函数)前加上 \(static\),该成员(函数)则是所有对象的共享成员(函数),可用直接通过 <类名>::<静态成员(函数)> 调用。
静态变量的初始化
int main() {
int initNum = 3;
for (int i=1; i<=5; i++) {
static int n1 = initNum;
n1++;
printf("%d\n", n1);
}
return 0;
}
/*
4
5
6
7
8
*/
int main() {
int initNum = 3;
for (int i=1; i<=5; i++) {
static int n1 = initNum;
{
int *p = &n1;
p++;
*p = 0;
}
n1++;
printf("%d\n", n1);
}
return 0;
}
/*
4
4
4
4
4
*/
通过上面两份代码会发现第一份代码的 \(initNum\) 只被初始化了一次,这是符合逻辑的,而第二份代码的 \(initNum\) 却被初始化了五次。
原因在于静态变量是通过静态变量后面的一个内存位作为记录标志该静态变量是否被初始化的,所以 \(p++; *p=0\) 其实就是每次把这个内存位置为空,让程序以为他还没有被初始化。
\(C\) 和 \(C\)++的区别
- \(C\)++ 是面向对象的语言,\(C\) 是面向过程的语言。
- \(C\)++ 具有 封装、继承、多态 三种特性。
- \(C\)++ 具有类型安全功能,例如强制类型转换。
- \(C\)++ 支持范式编程,例如模板类。
指针和数组区别
- 指针保存数据的地址,数据直接保存数据。
- 指针先得到地址,在通过地址访问数据,数组直接访问数据。
- 同类型指针可以直接赋值,数组只能一个个赋值。
- 指针常用于动态数据结构,数组则用于固定数目,类型相同的元素。
- 指针的内存分配通过 \(malloc、new、free、delete\) 动态分配,数组的内存在编译时分配好。
- \(32\) 位系统下,指针的 \(sizeof\) 都是 \(4\),数组的 \(sizeof\) 取决与数组所占空间的内存。
野指针
指向已删除的对象或者没有访问权限的内存的指针。
主要成因有三:指针没有被初始化、指针被 \(delete\) 或者 \(free\) 后没有置为 \(NULL\)、指针操作超出了所指对象作用范围。
指针(*)和引用(&)的区别
- 指针有自己的空间,引用不占空间。
- 指针是一种变量,引用是另一个对象的别名
- 指针的 \(sizeof\) 取决与操作系统,引用的 \(sizeof\) 取决于引用对象所占空间。
- 指针可以初始成 \(NULL\),引用的初始必须是另一个对象。
- 指针可以变换所指对象,而引用始终是一个对象的引用。
- 指针存在多级指针,而引用只有一级。