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