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;
}
时间: 2024-11-18 03:34:37

C++ static变量的钻牛角尖的相关文章

static 变量的作用:

概念:静态变量作用范围在一个文件内,程序开始时分配空间,结束时释放空间,默认初始化为0,使用时可以改变其值.静态变量或静态函数只有本文件内的代码才能访问它,它的名字在其它文件中不可见. 1.先来介绍它的第一条也是最重要的一条:隐藏 当我们同时编译多个文件时,所有未加static前缀的全局变量和函数都具有全局可见性. 2. static的第二个作用是保持变量内容的持久 存储在静态数据区的变量会在程序刚开始运行时就完成初始化,也是唯一的一次初始化.共有两种变量存储在静态存储区:全局变量和static

转:C语言中的static变量和C++静态数据成员(static member)

转自:C语言中的static变量和C++静态数据成员(static member) C语言中static的变量:1).static局部变量        a.静态局部变量在函数内定义,生存期为整个程序运行期间,但作用域与自动变量相同,只能在定义该变量的函数内使用.退出该函数后, 尽管该变量还继续存在,但不能使用它.        b.对基本类型的静态局部变量若在说明时未赋以初值,则系统自动赋予0值.而对自动变量不赋初值,则其值是不定的.2).static全局变量        全局变量本身就是静

VC和gcc在保证函数static变量线程安全性上的区别

VC和gcc不同,不能保证静态变量的线程安全性.这就给我们的程序带来了很大的安全隐患和诸多不便.这一点应该引起我们的重视!尤其是在构造函数耗时比较长的时候,很可能给程序带来意想不到的结果.本文从测试代码开始,逐步分析原理,最后给出解决方案. 多线程状态下,VC不能保证在使用函数的静态变量的时候,它的构造函数已经被执行完毕,下面是一段测试代码: class TestStatic { public: TestStatic() { Sleep(1000*10); m_num = 999; } publ

const、static变量存放位置

我们将以下面的例子介绍const变量和static变量的存放位置: static int val_a = 1; // 初始化的静态变量 int val_b = 2;        // 全局变量 const int val_c = 3;  // const 全局变量 static int val_d;     // 未初始化的静态变量 int val_e;            // 未初始化的全局变量 int main() { static int val_f = 5;  // 初始化的局部静

java执行程序的内存分析系列专栏二之static变量和方法内存分析

昨天写了简单的聊了下java执行程序时简单的内存划分,今天我们接着往下聊,聊聊static变量和方法的内存分析. 1.static变量和方法的第一个特性内存分析 statiic变量和方法的第一个特性能通过类名.static变量和类名.static方法的形式调用,而普通只能对象的形式调用.但具体为什么是这样的,这得分析static变量和方法他们在内存中怎样分配的,因此在这里我首先建立一个学生类,里面有一个普通成员变量和一个静态成员变量以及一个普通方法和一个成员方法,然后建立了一个测试学生的类. 1

Android 4.1 APP中的static变量即使在APP退出后仍然不会被擦除

Android 4.1 APP中的static变量即使在APP退出后仍然会保留最后赋值状态. public class MainActivity extends Activity { private TextView tv; private static int i=10; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentVie

static变量一般是放在.cpp或.c文件中

static变量是有文件作用域的, 在a.c中定义的,就不能在b.c或者其它文件中用了. 至于static变量, 如果要把它的声明放进.h文件, 则它就不应该是一个static变量了, static变量一般是放在.cpp或.c文件中,且声明和定义在一起 static变量一般是放在.cpp或.c文件中,布布扣,bubuko.com

ecmall中static变量的使用-model模型代码设计

? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 function &m($model_name, $params = array(), $is_new = false) {     <span style="backg

转载 IOS开发之---static变量

Objective-C 支持全局变量 主要有两种实现方式: (1)第一种和C/C++中的一样, 使用"extern"关键词: (2)另外一种就是使用单例实现. (比如我们经常会把一个变量放在AppDelegate里面作为全局变量来访问, 其中AppDelegate就是一个单例类)  在Objective-C中如何实现像C++中那样的静态成员变量呢? 你需要做的是在一个类A的implementation(.m或者.mm)文件中定义一个static变量,然后为A类定义静态成员函数(clas