首页 > 代码库 > C++ static变量的钻牛角尖

C++ static变量的钻牛角尖

最近面试的时候被问到了static的一些关于默认值,初始化,作用范围一系列的问题,好多都不会,虽然面上了,回来还是想好好把这些东西复习一下。


static变量的默认值(即不进行赋值与调用默认构造函数)

类外声明int float double 的static变量不初始化则默认值为0,可以使用不会报错,指针类型的static变量默认值为NULL

类中声明的static则默认没有初始化,不初始化使用则不能通过编译。


static变量的初始化

在类中声明的static 变量不会也不能在类中初始化,但是在使用前必须在类的外部初始化,不初始化则编译不通过

自定义的类的变量则会调用参数为空的构造函数进行对象的初始化,若没有参数为空的构造函数则不能通过编译

函数中的static变量会在函数执行的第一次进行初始化,之后便不进行初始化。类中的static变量在使用之前手动初始化。其他变量在main函数执行之前初始化。


static变量的访问范围

static声明的函数如果在头文件(.h)中同时包含的函数的定义,则在包含该头文件外部文件可以使用,如果在(.h)文件中只是声明了函数,函数定义卸载cpp文件中,则不能再包含该头文件的外部文件中使用static函数

在。头文件中声明的static 变量可以在包含该头文件的外部文件中使用


#include <iostream>
#include "ClassA.h"

using namespace std;


//类中的变量,没有默认值,使用前必须初始化,
int ClassA::i = 10;
float ClassA::f = 110.1f;
double ClassA::d = 1.22;
ClassB ClassA::b;

//类外的变量,有默认值,已经初始化
static int i;             
static float f;
static double d;
static ClassA* pa;

//没有为空的构造函数,不能自动初始化
//static ClassA a1;
static ClassA a2("second");


void testInit()
{
	ClassA a3("init");
}

int _tmain(int argc, _TCHAR* argv[])
{
	//不初始化使用则编译不通过
	cout << ClassA::i << endl;
	cout << ClassA::f << endl;
	cout << ClassA::d << endl;

	cout << i << endl;   //0
	cout << f << endl;   //0
	cout << d << endl;   //0

	if (pa == NULL)
	{
		cout << "NULL" << endl;  //NULL
	}

	i = 10;
	f = 10.1f;
	d = 100.2;

	cout << i << endl;  //0
	cout << f << endl;  //10.1
	cout << d << endl;  //100.2 

	testInit();         //Class B init
	testInit();         //已经初始化过了,不再初始化
	
	system("pause");
	return 0;
}


C++ static变量的钻牛角尖