C++中參數的持續性,作用域和連接性。
稍稍看了會C++ Primer,然後把書中講這部分的內容精簡下。
先給大家說下自動變量,這個是在函數中用的,我個人認為是比較多的一中變量。自動變量的修飾符是(auto),但一般情況下我們忽略它,它是在代碼塊中被創建,當代碼塊結束就消失的一種變量。它是存放在堆棧中,所以可想而知,當堆棧結束後,變量也不在了。
接下來講下自動變量中的寄存器變量,上面說了,變量放在堆棧中,所以會消耗內存,而寄存器變量則解決了這個問題,它需要在自動變量聲明前加上一個“register”,這樣編輯器就會去使用寄存器來處理變量。但記住一點,由於寄存器上沒有地址,所以,對寄存器變量不能使用取地址符號。
接下來說一下靜態變量。這個是我個人感覺很頭疼的一種變量。
首先,靜態存儲持續性有三種鏈接性,1.外部鏈接性,2.內部鏈接性,3.無連接性。
下面上一張表格,裡面介紹了五種存儲方式。
5種變量儲存方式
存儲描述
持續性
作用域
鏈接性
如何聲明
自動
自動
代碼塊
無
在代碼塊中,(auto)
寄存器
自動
代碼塊
無
在代碼塊中,用register
靜態,無連接性
靜態
代碼塊
無
在代碼塊中,用static
靜態,外部鏈接性
靜態
文件
外部
在函數外面
靜態,內部鏈接性
靜態
文件
內部
在函數外面,使用關鍵字static
我先貼這些上來,相信大家也都能看懂些,時間不早了,先睡覺去,明天晚上下班後,接著補充,到時候給大家上幾段代碼,然後介紹下命名空間,其實也是一種作用域。嘿嘿,先挖個坑在這,明天來填坑,啊不對。。12點了,是今天晚上。。。
繼續更新,接下來貼一段靜態修飾的,外部鏈接性的例子
- #include <iostream>
-
- using namespace std;
- //注意warming變量
- double warming = 0.3; //全局變量 稱為定義,給變量分配存儲空間
-
- void update(double dt);
- void local();
-
- int main(){
- cout << "Global warming is " << warming << " degrees.\n";
- update(0.1);
- cout << "Global warming is " << warming << " degrees.\n";
- local();
- cout << "Global warming is " << warming << " degrees.\n";
- return 0;
- }
-
- void update(double dt)
- {
- extern double warming; //引用外部變量 為0.3<SPAN> </SPAN>稱為聲明,不給變量分配存儲空間
- warming += dt;
- cout << "UPdating gloabal warming to " << warming;
- cout << " degrees.\n";
- }
-
- void local()
- {
- double warming = 0.8; //隱藏了外部變量 為0.8
- cout << "Local warming = " << warming << " degrees.\n";
- cout << "the global waming is " << ::warming;
- }
這個注釋蠻清楚了,最好運行下自己看看。
下面兩段代碼是靜態修飾,內部鏈接性的例子
file1.cpp
- #include <iostream>
-
- int tom = 3; //
- int dick = 30; //
- static int harry = 300; //內部鏈接性,只在該函數內部可用。
-
- void remote_access();
-
- int main()
- {
- using namespace std;
- cout << "main()reports the following addresses: \n";
- cout << &tom << " = &tom, " << &dick << " = &dick, ";
- cout << &harry << " = &harry\n";
- cout << tom << ' ' << dick << ' ' << harry << ' ' << endl; // 3 30 300
- remote_access();
- return 0;
- }
file2.cpp
- #include <iostream>
-
- extern int tom;
- static int dick = 10; //內部鏈接性
- int harry = 200;
-
- void remote_access()
- {
- using namespace std;
- cout << "remote_access() reports the following address: \n";
- cout << &tom << " = &tom, " << &dick << " = &dick, ";
- cout << &harry << " = &harry\n";
- cout << tom << ' ' << dick << ' ' << harry << ' ' << endl; // 3 10 200
- }