static与extern

static:

C:

1.0在全局变量前面加上static,这改变了链接属性(仅限当前文件使用),编译器在编译时会把多个文件汇总为一份,加了static后该变量不能跨文件共享。

2.0作为局部变量使用,这改变了变量的生命周期(即变量具有记忆属性)

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h> 
#include<windows.h>
FunTest()
{
	static int a;
	a++;
	printf("%d\n", a);
}
int main()
{
	FunTest();
	FunTest();
	FunTest();
	system("pause");
	return 0;
}


CPP:

C++怎么统计类对象个数?

1.0用全局变量(容易被改变)

2.0用成员变量(有隐蔽性,但是没有记忆性)

所以有了static+成员变量,同时具有以上两种的优势而且具有隐蔽性。代码如下

代码二:

#include<iostream>  
using namespace std;
class A
{
public:
	static int count;

	A(){ ++count; };
	A(const A& a)
	{ ++count; };
	~A(){ --count; };
	int GetCount()//可读可写
	{

		return count;//只读
	}
	void Funtest1()//可读可写
	{
		FunTest();//只读
	}
	static void FunTest()//只读
	{
		cout << count << endl;// 只读
	}

};
int A::count = 0;//静态变量要在类外初始化  
void FunTest();
int main()
{

	A a;
	cout << a.GetCount() << endl;
	A d(a);
	cout << d.GetCount() << endl;
	A c = a;
	cout << c.GetCount() << endl;
	cout << A::count << endl;
	A *b = new A;
	cout << b->GetCount() << endl;
	delete b;
	cout << b->GetCount() << endl;
	system("pause");
	return 0;
}



结果如下:


以上代码说明了static 类成员变量需要在类外初始化,也说明了类实例化的3种情况

情况1:直接用默认构造函数;

情况2:用默认拷贝构造函数;

情况3:用new来为类分配空间--》A *b = new A;

还说明了1.0普通成员函数可以调用static型成员变量,2.0 static 型成员函数可以调用static型成员变量;

3.0 普通成员函数可以调用static 型成员函数 4.0 访问static 型成员函数和static型成员变量时有两种方法:

第一种:对象.static 型成员函数(对象.static 型成员变量) 。

第二种:类名::static 型成员函数(类名::static 型成员变量)。

以上调用可以用下图说明:


extern:

C/C++

extern:标示变量或者函数的定义在别的文件中提示编译器遇到此变量和函数时在其他模块中寻找其定义。此外extern也可用来进行链接指定。

#include<iostream>
using namespace std;
extern "C" void fun(int a, int b);
int main()
{
	fun(2,3);
	system("pause");
	return 0;
}
结果如下:


意料中的事情,如果没有extern"C"应该报CPP的链接错误即下图:


所以说 extern"C"指的是以c语言的形式编译。

1.0 extern变量和extrn函数:一个变量在a文件里定义,可以在b文件里使用(加上extern后),前提是ertern申明和定义的函数必须完全一致,否则,看下面代码

代码三:

test.cpp:

#include<iostream>
using namespace std;
extern void fun(int a, int b);
int main()
{
	fun(2,3);
	system("pause");
	return 0;
}
test1.cpp:

#define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>
using namespace std;
int fun(int a, int b)
{
	return a + b;
}
仅仅返回值不同,看错误如下:


还可以这样用:在.c文件中申明了一个全局变量,这个变量如果要被引用,它的定义必须在.h文件里并用extern来申明。

2.0 extern 函数声明
  常常见extern放在函数的前面成为函数声明的一部分,那么,C语言的关键字extern在函数的声明中起什么作用?
  如果函数的声明中带有关键字extern,仅仅是暗示这个函数可能在别的源文件里定义,没有其它作用。即下述两个函数声明没有明显的区别。

最后再来看看ststic和extern的异同点。

 (1) extern 表明该变量在别的地方已经定义过了,在这里要使用的是那个变量.
 (2) static 表示静态的变量,分配内存的时候, 存储在静态区,不存储在栈上面.

static 作用范围是内部连接的关系, 和extern有点相反.它和对象本身是分开存储的,extern也是分开存储的,但是extern可以被其他的对象用extern 引用,而static 不可以,只允许对象本身用它. 具体差别首先,static与extern是“水火不容”,也就是说extern和static不能同时修饰一个变;其次,static修饰的全局变量声明与定义同时进行,也就是说当你在头文件中使用static声明了全局变量后,它也同时被定义了;最后,

static的作用域在本文件,类对象的话就在类内。

总结:

static成员
声明为static的类成员(成员数据或成员函数)称为类的静态成
员。
【特性】
1、静态成员为所有类对象所共享,不属于某个具体的实例。
2、类静态成员即可用类名::静态成员或者对象.静态成员来访

3、类静态成员变量必须在类外定义,定义时不添加static关键

4、类的静态成员函数没有默认的this指针,因此在它里面不能
使用任何非静态成员
5、静态成员和类的普通成员一样,也有public、protected、
private3种访问级别,也可以具有返回值,const修饰符等参数。



猜你喜欢

转载自blog.csdn.net/WhiskyCocktail/article/details/78414685
今日推荐