1. 程式人生 > 其它 >C++靜態全域性變數

C++靜態全域性變數

技術標籤:C++

遇到這麼一個神奇的問題。

//A.h
#pragma once
#include <iostream>
static int a;
void Get();

//A.cpp
#include "A.h"
void Get()
{
    //輸出A地址
	std::cout << "Get: " << &a << std::endl;
}

//main.cpp
#include "A.h"

int main()
{	
	Get();
    //再次輸出A地址
	std::cout << "main: " << &a << std::endl;
	
	return 0;
}

初看,不是很簡單的問題嗎!輸出的地址是一樣的嘛!

看答案:

怎麼會這樣!!!

為什麼會這樣呢?明明同一個變數怎麼地址不一樣呢?原因其實很簡單:變數'a'被定義為了一個靜態變數,全域性的靜態變數有這麼一個性質:

靜態全域性變數在宣告它的整個檔案都是可見的,而在檔案之外是不可見的。

優點:靜態全域性變數不能被其它檔案所用;其它檔案中可以定義相同名字的變數,不會發生衝突。

所以上面的程式碼實際上是這樣的:

//A.cpp
static int a; <---
void Get()
{
    //輸出A地址
	std::cout << "Get: " << &a << std::endl;
}



//main.cpp
static int a; <---
int main()
{	
	Get();
    //再次輸出A地址
	std::cout << "main: " << &a << std::endl;
	
	return 0;
}