C++变量声明与定义(有对引用的解释)
一.extern
如果想声明一个变量而非定义它,就使用关键字extern并且不要显式地初始化变量:
extern int i; // 声明i而非定义i
extern int i = 1; // 定义i, 这样做抵消了extern的作用
二.static
当我们在C/C++用static
修饰变量或函数时,主要有三种用途:
- 局部静态变量
- 外部静态变量/函数
- 类内静态数据成员/成员函数
其中第三种只有C++中有,我们后续在面向对象程序设计中再探讨,这里只讨论静态局部/全局变量。
1. 静态局部变量
在局部变量前面加上static
说明符就构成静态局部变量,例如:
// 声明局部静态变量
static int a;
static int array[5] = {1, 2, 3, 4, 5};
- 静态局部变量在函数内定义,但不像自动变量那样当函数被调用时就存在,调用结束就消失,静态变量的生存期为整个源程序
- 静态变量的生存期虽然为整个源程序,但是作用域与自动变量相同,即只能在定义该变量的函数内使用该变量,退出函数后虽然变量还存在,但不能够使用它
- 对基本类型的静态局部变量如果在声明时未赋初始值,则系统自动赋0值;而对普通局部变量不赋初始值,那么它的值是不确定的
根据静态局部变量的特点,它的生存期为整个源程序,在离开定义它的函数(作用域)但再次调用定义它的函数时,它又可继续使用,而且保存了前次被调用后留下的值。因此,当多次调用一个函数且要求在调用之间保留某些变量的值时,可考虑采用静态局部变量,虽然用全局变量也可以达到上述目的,但全局变量有时会造成意外的副作用,因此最好采用局部静态变量。例如:
#include <iostream>void foo() {int j = 0; // 普通局部变量static int k = 0; // 静态局部变量++j;++k;printf("j:%d, k:%d\n", j, k);
}int main(void)
{for (int i = 1; i <= 5; i++) {foo();}
}// 输出:
j:1, k:1
j:1, k:2
j:1, k:3
j:1, k:4
j:1, k:5
Tips:普通局部变量的生命周期仅限于它们所在的作用域。例如,如果一个局部变量在函数内部定义,那么它在函数调用时创建,在函数返回时销毁。
三. 引用
1.概念
引用一旦初始化,就不能再指向其他对象:与指针不同,引用在初始化后就不能被重新赋值。
引用必须被初始化:在声明引用时,必须立即用另一个变量来初始化它。
引用不是对象:引用仅仅是一个已存在对象的别名,并不占用额外的存储空间。(起别名)
引用的操作实际上是对引用所指向的对象的操作:对引用的任何操作实际上都是对它所引用的对象的操作。
2.声明引用
int main() {int a = 10;int &ref = a; // ref是变量a的引用return 0;
}
在这个例子中,ref
是a
的引用,对ref
的操作实际上就是对a
的操作。
3.使用引用
int main() {int a = 10;int &ref = a;ref = 20; // 这实际上是将a的值设置为20std::cout << a << std::endl; // 输出20return 0;
}
在这个例子中,通过引用ref
改变了变量a
的值。
4.引用作为函数参数
引用常用于函数参数,以允许函数直接修改传入的参数。
void swap(int &x, int &y) {int temp = x;x = y;y = temp;
}int main() {int a = 10, b = 20;swap(a, b); // a和b的值将会交换return 0;
}
在这个例子中,swap
函数通过引用参数交换了两个整数的值。