C++中的全局变量声明和定义

1.全局变量

全局变量在整个源文件的作用域都是有效的,只需要在一个源文件中定义全局变量,在其他不包含全局变量定义的源文件中用extern关键字再次声明这个全局变量即可。

也可以在一个源文件中定义这个全局变量,在头文件中用extern关键字再次声明这个全局变量,如果其它源文件要用到这个全局变量,只需要包含这个头文件就可以直接使用了。

例:我在class1中定义一个全局变量数组a[20],在class1中对数组a的赋值,我想在class2中使用,其方法如下。

class1.h文件:

#include <stdio.h>
#include <iostream>
using namespace std;
extern int a[20];    //extern 关键字再次声明这个全局变量
class class1
{
public:
	class1();
	~class1();

	static int c;

};

class1.cpp文件:

#include "class1.h"

int a[20];	//全局变量

int class1::c = 1;	//类中静态变量的初始化

class1::class1()
{
	cout << "class1中数组a的值:";
	for (int i = 0; i < 20; i++) {
		a[i] = i + 1;
		cout << " " << a[i];
	}
	c = 2;
	cout << "\n";
}

class1::~class1()
{
}

class2.h文件:

#pragma once
#include "class1.h"

class class2
{
public:
	class2();
	~class2();
private:
	class1 c1;
	class1 c2;
};

class2.cpp文件:

#include "class2.h"

class2::class2()
{
	cout << "c1.c的值为:" << c1.c << "     c2.c的值为:" <<c2.c<< endl;
	c1.c = 5; 
	cout << "c1.c的值为:" << c1.c << "     c2.c的值为:"<< c2.c << endl;
	cout << "class2中数组a的值:";
	for (int i = 0; i < 20; i++) {
		cout << " " << a[i];
	}
	cout << endl;
}

class2::~class2()
{
}
#include<stdio.h>
#include<iostream>
#include <string>
#include<math.h>
#include "class1.h"
#include "class2.h"
using namespace std;

int main()
{
	class1 a1;
	class2 a2;
	system("pause");
	return 0; 
}

运行结果:

class1中对数组a的赋值,在class2中可以成功取出来。

在这个程序中还对类中的静态变量做了验证,类中声明了静态成员变量,在类中,静态成员变量可以实现多个对象之间的数据共享,并且使用静态数据成员还不会破坏隐藏的原则,即保证了安全性。因此,静态成员是类的所有对象中共享的成员,而不是某个对象的成员。上面代码中,在对class1的对象c1指向的c赋值为5后,对象c2指向的c也变成了5,说明静态成员变量实现了类对象间数据的共享,该类生成的对象中的静态成员便改良指向同一个地址。


2.static全局变量

static和extern来修饰同一个变量,即static和extern不可同时出现。

 static修饰的全局变量是声明与定义同时进行,就是说只要你在头文件中使用static声明一个全局变量,同时它也就被定义了。

static修饰的全局变量是文件作用域的,即他只能在当前文件中有用。在其他文件中使用时,其他编译单元会另外开个内存保存它,在其他编译单元对它的修改并不影响它本身值。因为它所在的物理地址和其他编译单元使用它时的物理地址不一样。

猜你喜欢

转载自blog.csdn.net/whocarea/article/details/84887401