最近面试的时候被问到了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; }
时间: 2024-11-18 03:34:37