c++中的“静态”

“静态”这个概念,在学习c++的过程中反复出现过。它在不同的地方具有不同的含义,而对于学习而言,将不同层次的知识放在一起讨论是融会贯通的一种非常好的方法。本文将对c++中的“静态”概念进行探讨。

1.静态变量

静态变量是存储在静态存储区的变量,这意味着它的生命周期是整个程序的存续期。也就是说,静态变量自声明起到程序结束,始终存储在内存当中。如果不对静态变量进行初始化赋值,则默认其值为0(指针即为nullptr)。

静态变量从宏观上可以分为全局静态变量和局部静态变量。从链接性(可见性)来看,静态变量又分为三种:

1.具有外部链接性的静态变量

这就是我们常见的“全局变量”。通常在函数外声明,并可以在其他文件中调用,但调用时需要加上关键字extern。如在cpp1.cpp文件中声明了如下的静态变量:

int a=2;

另外有一个文件cpp2.cpp与cpp1.cpp一同编译。那么,在cpp2.cpp中可以调用变量a,但在使用前,需要进行声明:

extern int a;

需要注意的是,在cpp2.cpp中定义的同名局部变量会覆盖掉全局变量(在cpp1.cpp中也是如此)。因此,如果需要在定义了同名局部变量的函数中使用全局变量,需要使用作用域解析运算符::,即::a。

2.具有内部链接性的静态变量

在函数外定义的全局变量,如果显式地声明为static型,则成为具有内部链接性的静态变量。所谓内部链接性,即只在当前文件中可见,而不能外部文件中对其进行调用。如下定义:

static int a=1;

由于具有内部链接性的静态变量可见性小于具有外部链接性的静态变量,因此同一文件下同名的具有内部链接性的静态变量将覆盖具有外部链接性的静态变量。

3.无链接性的静态变量

在函数或代码块内使用static显式声明的变量为无链接性的静态变量。所谓无链接性,即变量的可见性只存在于函数或代码块内部。如下所示:

void test()
{
	static int a=1;
	...
}

当前,即使是无链接性的静态变量,也是“静态变量”。这意味着变量的生命期是整个程序的存续期。多次调用test()函数时,上一次变量a的值将被保留下来。

2.静态类成员

当类成员被声明为static时,意味着它不再是具体的类对象的成员,而是属于整个类的成员。类的成员变量与成员方法均可以被声明为静态。

1.静态成员变量

静态成员变量的定义如下所示:

class myclass{
	static int a;
};

int myclass::a=1;

静态类成员变量通常和其他静态变量存储在一起,而非存储在类对象中。值得一提的是,如果将静态成员变量设置为const型,则必须在类定义时给其初始化,否则编译器会报错,如下所示:

class myclass{
	static const int a=1;
};

2.静态成员方法

类的成员方法也可以声明为static型,但类对象不可以直接调用静态成员方法。外部想要调用静态成员方法,只能通过类名访问。同时,由于静态成员方法不是属于类对象的,因此在方法内不能调用非静态成员变量,而只能调用静态成员变量。如下:

class myclass{
private:
	static int a;
	int b;
public:
	static void test()
	{
		a++;
//		b++;                           不可调用非静态成员                 
	}
};

int myclass::a=1;

myclass::test();

最后还值得一提的是静态联编的概念。所谓联编,是指在有多个重载函数下,编译器调用哪一个的问题。通常编译器会根据函数特征标做出判断,即在编译阶段即可确定调用的函数,这称为静态联编(又叫早期联编)。

猜你喜欢

转载自blog.csdn.net/xbb123456rt/article/details/81636736