程序员人生 网站导航

C++ static变量的钻牛角尖

栏目:MySql时间:2014-10-04 08:00:00

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


------分隔线----------------------------
------分隔线----------------------------

最新技术推荐