首页 > 编程语言 > 详细

[C/C++]_[初级]_[关于static修饰符的说明]

时间:2015-12-12 08:17:06      阅读:274      评论:0      收藏:0      [点我收藏+]


场景:

1. static 修复符具有静态共享特性, 在C/C++里一般用来作为共享变量使用,或者节约内存声明的常量或不改变大小的存储区.

2. static活用的话也可以作为单例模式的便捷方式.

[并发并行]_[线程同步]_[C/C++实现单例模式分析]

3. 总的说来static是文件范围内可见的,或类,函数范围内可见的. 注意: 非全局可见的.

4. 注意, 文件范围内可见的static(一种是文件内声明的静态变量,一种是类静态成员变量)会在main执行前先执行, 如果是类, 那么会调用构造函数, 如果是原始类型, 会初始化为0.


下边是对static关键字的详细说明,参考:

https://msdn.microsoft.com/en-us/library/y5f6w579.aspx

https://msdn.microsoft.com/zh-cn/cn-zh/library/y5f6w579.aspx


static 关键字可用于在全局范围、命名空间范围和类范围声明变量和函数。 静态变量还可在本地范围声明。

静态持续时间意味着,在程序启动时分配对象或变量,并在程序结束时释放对象或变量。 外部链接意味着,变量的名称在用于声明变量的文件的外部是可见的。 相反,内部链接意味着,名称在用于声明变量的文件的外部是不可见的。 默认情况下,在全局命名空间中定义的对象或变量具有静态持续时间和外部链接。 在以下情况下,可使用 static 关键字。

在文件范围(全局和/或命名空间范围)内声明变量或函数时,static 关键字将指定变量或函数具有内部链接。 在声明变量时,变量具有静态持续时间,并且除非您指定另一个值,否则编译器会将变量初始化为 0。

在函数中声明变量时,static 关键字将指定变量将在对该函数的调用中保持其状态。

在类声明中声明数据成员时,static 关键字将指定类的所有实例共享该成员的一个副本。 必须在文件范围内定义静态数据成员。 声明为 conststatic 的整型数据成员可以有初始值设定项。

在类声明中声明成员函数时,static 关键字将指定类的所有实例共享该函数。 由于函数没有隐式 this 指针,因此静态成员函数不能访问实例成员。 若要访问实例成员,请使用作为实例指针或引用的参数来声明函数。

不能将联合成员声明为静态的。 但是,全局声明的匿名联合必须是显式声明的 static。


从 C++11 开始,可以保证静态本地变量初始化是线程安全的。 此功能有时称为神奇的静态对象。 但是,在多线程应用程序中,必须同步所有后续分配。 可以通过使用 /Zc:threadSafeInit- 标志避免对 CRT 形成依赖,来禁用线程安全的静态对象功能。

test.cpp

#include <iostream>
#include <stdlib.h>
#include <vector>

// 5.全局声明的匿名联合必须是显式声明的 static。g++貌似不用显示static
union
{
	int i;
	char j[4];
	int k;
}tt;

class A
{
public:
	A(int i)
	{
		std::cout << "A:" << i << " Object Count: " << ++count_ << std::endl;
	}
	~A(){}

	// 3.在类声明中声明数据成员时,static 关键字将指定类的所有实例共享该成员的一个副本。 
	static int count_;

	// 3.声明为 conststatic 的整型数据成员可以有初始值设定项
	static const int index_ = 0;

	// 在类声明中声明成员函数时,static 关键字将指定类的所有实例共享该函数。 
	// 由于函数没有隐式 this 指针,因此静态成员函数不能访问实例成员。 
	// 若要访问实例成员,请使用作为实例指针或引用的参数来声明函数。
	static void Log(A* a1,A& a2)
	{
		a1->Print();
		a2.Print();
	}

	void Print()
	{
		// 2.在函数中声明变量时,static 关键字将指定变量将在对该函数的调用中保持其状态。
		static int i  = 0;
		std::cout << "i: " << ++i << std::endl;
	}

	union YY
	{
		//static int i; 错误. 5.不能将联合成员声明为静态的
		int i;
		char j[4];
		int k;
	}yy;

};

// 3.必须在文件范围内定义静态数据成员。根据条款1,初始化为0.
int A::count_;

// 1.在文件范围(全局和/或命名空间范围)内声明变量或函数时,static 关键字将指定变量或函数具有内部链接。 
// 在声明变量时,变量具有静态持续时间,并且除非您指定另一个值,否则编译器会将变量初始化为 0。
static A a1(1);
// 初始化为0.
static int gNum;

// 非static,具有静态持续时间和外部链接特性.
A a2(2);


int main(int argc, char const *argv[])
{
	std::cout << "begin main" << std::endl;
	// 使用C++11特性的auto自动转换类型.
	auto arr = new std::vector<int>();

	a1.Print();
	a2.Print();

	A::Log(&a1,a2);
	//int integer = A::ut.i;
	std::cout << "tt.i: " << tt.i << std::endl;
	std::cout << "a1::yy.i: " << a1.yy.i << std::endl;
	std::cout << "end main" << std::endl; 
	return 0;
}

输出:

A:1 Object Count: 1
A:2 Object Count: 2
begin main
i: 1
i: 2
i: 3
i: 4
tt.i: 0
a1::yy.i: 0
end main




[C/C++]_[初级]_[关于static修饰符的说明]

原文:http://blog.csdn.net/infoworld/article/details/50270135

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!