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