最近面试的时候被问到了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;
}