1. 程式人生 > >C++中的全域性變數宣告和定義

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修飾的全域性變數是檔案作用域的,即他只能在當前檔案中有用。在其他檔案中使用時,其他編譯單元會另外開個記憶體儲存它,在其他編譯單元對它的修改並不影響它本身值。因為它所在的實體地址和其他編譯單元使用它時的實體地址不一樣。