C++變量存儲方式通過 存儲持續(xù)性、作用域、鏈接性 來描述的。
存儲持續(xù)性
存儲持續(xù)性 描述變量的生命周期,它可分為 自動存儲、靜態(tài)存儲、動態(tài)存儲、線程存儲。
自動存儲
在函數(shù)中創(chuàng)建的變量為自動存儲變量,它的生命周期始于創(chuàng)建時,止于函數(shù)結(jié)束。
void show()
{
// 自動存儲變量: 函數(shù)內(nèi)存創(chuàng)建
int a = 0;
}
靜態(tài)存儲
在函數(shù)定義的外部聲明的變量,或使用static修飾的變量,都為靜態(tài)存儲變量,它在程序運行時一直存在。
// 靜態(tài)存在變量:在函數(shù)定義的外部聲明
int global = 1;
// 靜態(tài)存儲變量: static修飾的變量
static int internal_file = 2;
void show()
{
// 靜態(tài)存儲變量: static修飾的變量
static int count = 1;
}
動態(tài)存儲
使用new操作符創(chuàng)建的變量為動態(tài)存儲變量,它的生命周期持續(xù)到使用delete操作刪除變量內(nèi)存。
作用域
作用域 描述變量在當前文件中的可見范圍,它分為 局部變量 和 全局變量。
局部變量
在函數(shù)內(nèi)部聲明的變量為局部變量,它只在函數(shù)內(nèi)部可見。
void show()
{
// 局部變量,show()函數(shù)內(nèi)部可見
int a = 0;
}
全局變量
全局變量在是函數(shù)定義的外部定義的變量,它在整個文件中可見。
// 全局變量,整個文件可見
int global = 1;
// 全局變量,整個文件可見
static int internal_file = 2;
int main()
{
return 0;
}
void show() {
}
鏈接性
鏈接性描述變量在多個文件間的可見性,它分為 外部變量、內(nèi)部變量。
外部變量 在多個文件可見,內(nèi)部變量 只在當前文件可見。
// 外部變量,多個文件可見
int global = 1;
// 內(nèi)部變量,只在當前文件可見
static int internal_file = 2;
// const修飾的外部變量,變?yōu)榱藘?nèi)部變量
const int MONTHS = 12;
// extern const 修飾的外部變量,仍為外部變量
extern const int DAYS = 365;
void show()
{
// 內(nèi)部變量,只被初始化一次
static int count = 0;
}
const 修飾的外部變量,會變?yōu)閮?nèi)部變量,只在當前文件內(nèi)部可見。否則,把const修飾的外部變量放到頭文件中,然后被多個源文件引用,那么變量將會出現(xiàn)多處定義。
外部變量的規(guī)則
外部變量只能在一處聲明,多處引用,引用時需要使用extern關(guān)鍵字。
// file1.cpp
// 聲明初始化
int global = 1;
// file2.cpp
// 使用extern關(guān)鍵字,引用外部變量
extern int global;
外部變量的特殊使用
如果局部變量與外部變量沖突,那么如何引用外部變量呢,C++可以通過作用域解析來訪問外部變量
#include <iostream>
int global = 10;
int main()
{
using std::cout;
using std::endl;
int global = 20;
cout << "local global = " << global << endl;
// 通過::作用域解析符,使用外部變量global
cout << "Global global = " << ::global << endl;
return 0;
}