下載本文檔
版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
第九章內存模型和名稱空間1、 單獨編譯?頭文件經常包含的內容(1) 函數原型(2) 使用#define或const定義的符號常量(3) 結構聲明(4) 類聲明(5) 模板聲明(6) 內聯函數?如果文件名包含在尖括號中,則C++編譯器將在存儲標準頭文件的主機系統(tǒng)的文件系統(tǒng)中查找。但如果文件名包含在雙引號中,則編譯器將首先查找當前的工作目錄或源代碼目錄。2、 存儲持續(xù)性、作用域和鏈接性?自動存儲持續(xù)性:在函數定義中聲明的變量(包括函數參數)的存儲持續(xù)性為自動的。在程序開始執(zhí)行其所屬函數或代碼塊時被創(chuàng)建,執(zhí)行完函數或代碼塊時,它們使用的內存被釋放。?靜態(tài)存儲持續(xù)性:在函數外定義的變量和使用關鍵字static定義的變量的存儲性都為靜態(tài)。它們在程序整個運行過程中都存在。?線程存儲持續(xù)性:如果變量是用thread_local聲明的,則其聲明周期與所屬的線程一樣長。?動態(tài)存儲持續(xù)性:用new運算符分配的內存將一直存在,直到使用delete運算符將其釋放或程序結束為止。這種內存的存儲持續(xù)性為動態(tài),有時稱為自由存儲或堆。?在函數原型作用域中使用的名稱只在包含參數列表的括號內可用(這就是為什么這些名稱是什么以及是否出現都不重要的原因)。?在類中聲明的成員的作用域為整個類。?intmain(){intteledeli=5;{intteledeli=5;}}這樣有兩個同名的變量(一個位于代碼塊中,另一個位于內部代碼塊中)。這樣,會將teledeli解釋為局部代碼塊變量。我們說,新的定義隱藏了以前的定義。新定義可見,舊定義暫時不可見。?自動變量和棧程序使用兩個指針來跟蹤棧,一個指針指向棧底一一棧的開始位置,另一個指針指向堆頂一一下一個可用內存單元。當函數被調用時,其自動變量將被加入到棧中,棧頂指針指向變量后面的下一個可用內存單元。函數結束時,棧頂指針被重置為函數被調用前的值,從而釋放新變量使用的內存。新值沒有被刪除,但不再被標記。它所占據的空間將被下一個將值加入到棧中的函數調用所使用。3、 靜態(tài)持續(xù)性,外部鏈接性?C++為靜態(tài)存儲持續(xù)性變量提供了3種鏈接性:外部鏈接性(可在其他文件中訪問)內部鏈接性(只能在當前文件中訪問)和無鏈接性(只能在當前函數或代碼塊中訪問)。?鏈接性為外部的靜態(tài)持續(xù)變量要想創(chuàng)建鏈接性為外部的靜態(tài)持續(xù)變量,必須在代碼塊外部聲明它;要創(chuàng)建鏈接性為內部的靜態(tài)持續(xù)變量,必須在代碼塊的外面聲明它,并使用static限定符;要創(chuàng)建沒有鏈接性的靜態(tài)持續(xù)變量,必須在代碼塊內聲明它,并使用static限定符。外部變量時在函數外部定義的,因此對所有函數而言它都是外部的。例如:可以在main()函數或頭文件定義它們,可以在文件中位于外部變量定義后面的任何函數中使用它,因此外部變量也稱全局變量。?在每個使用外部變量的文件中,都必須聲明它。另一方面,C++有單定義規(guī)則,變量只能有一次定義。C++提供了兩種變量聲明,一種是定義聲明,或簡稱為定義。它給變量分配存儲空間。另一個種是引用聲明,或簡稱為聲明,它不給變量分配存儲空間。因為它引用已有的變量。引用聲明使用關鍵字extern,且不進行初始化;否則,聲明為定義。doubleup;//definition,upis0externintblem;//blemdefinedsomewhereelseexternchargr=‘s’/definitionbecauseinitialized定義與全局變量同名的局部變量后,局部變量將隱藏全局變量。?鏈接性為內部的靜態(tài)持續(xù)變量如果初始化了靜態(tài)局部變量,則程序只在啟動時進行一次初始化。以后再調用函數時,將不會像自動變量那樣再次被初始化。?關鍵字volatile。即使程序代碼沒有對內存單元進行修改,其值也可能發(fā)生變化。可以將一個指針指向某個硬件位置,其中包含了來自串行端口的時間或信息,這種情況下,硬件(而不是程序)可能修改其中的內容?;騼蓚€程序可能互相影響,共享數據。?const關鍵字const全局變量的鏈接性為內部的。也就是說,在C++看來,全局const定義(如下述代碼所示)就像使用了static說明符一樣。constintfingers=10;//sameasstaticconstintfingers=10intmain()(}如果希望某個常量的鏈接性為外部的,可以使用extern關鍵字來覆蓋默認的內部鏈接性externconstintstates=59;//definitionwithexternallinkage4、 函數的鏈接性?所有函數的存儲性都自動為靜態(tài)的,即在整個程序執(zhí)行期間都一直存在。?在默認情況下,函數的鏈接性為外部的,即可以在文件間共享。?還可以使用關鍵字static將函數的鏈接性設置為內部的,使之只能在一個文件中,必須同時在原型和函數定義中使用該關鍵字。這意味著該函數只在文件中可見,還意味著可以在其他文件中定義同名的函數。?和變量一樣,在定義靜態(tài)函數的文件中,靜態(tài)函數將覆蓋外部定義,因此即使在外部定義了同名的函數,該文件仍將使用靜態(tài)函數。?內聯函數不受這項規(guī)則約束,這允許程序員能夠將內聯函數的定義放在頭文件中。這樣包含了頭文件的每個文件都有內聯函數的定義。然而,C++要求同一個函數的所有內聯定義都必須相同。4、 定位new運算符?它讓您能夠指定要使用的位置。-delete只能用于這樣的指針:指向常規(guī)new運算符分配的堆內存。?定位new運算符只返回傳遞給它的地址,并將其強制轉換為void*,以便能夠賦給任何指針類型。C++允許程序員重載定位new函數。5、 名稱空間?名稱空間可以是全局的,也可以位于另一個名稱空間中,但不能位于代碼塊中。因此,默認情況下,在名稱空間中聲明的名稱的鏈接性為外部的(除非它引用了常量)。using聲明using聲明由被限定的名稱和它前面的關鍵字using組成例如:usingstd::cin;using編譯指令using編譯指令由名稱空間名和它前面的關鍵字usingnamespace組成。using聲明使一個名稱可用,using編譯指令使空間中的所有的名稱都可用。?編譯器不允許同時使用兩個或兩個以上using聲明,因為這將導致二義性。?如果使用using編譯指令導入一個已經在函數中聲明的名稱,則局部名稱將隱藏名稱空間名,就像隱藏同名的全局變量一樣。不過仍可以使用作用域解析運算符使用空間名。?注意:假設名稱空間和聲明區(qū)域定義了相同的名稱,如果試圖使用using聲明將名稱空間的名稱導入該聲明區(qū)域,則這兩個名稱會發(fā)生沖突,從而出錯。如果使用using編譯指令將該名稱空間的名稱導入該聲明區(qū)域,則局部版本將隱藏名稱空間版本。?可以將名稱空間聲明進行嵌套namespaceelements{namespacefire{intflame;}floatwater;}這里flame指的是elements::fire::flame,同樣,可以使用下面的using編譯指令使內部的名稱可用,usingspacenameelements::fire;?在名稱空間中聲明的函數名的作用域為整個名稱空間,因此定義和聲明必須位于同一個名稱空間中。using聲明只使用了名稱(對函數),因此,如果函數被重載,則一個using聲明將導入所有的版本。?一些使用原則:(1)使用在已命名的名稱空間中聲明的變量,而不是使用外部全局變量、靜態(tài)全局變量。如果開發(fā)了一個函數庫或類庫,將其放在一個名稱空間中。僅將編譯指令using作為一種舊代碼轉換為使用名稱空間的權宜之計。不要在頭文件中使用using編譯指令。首先這樣做掩蓋了要讓哪些名稱可用;另外,包含頭文件的順序可能影響程序的行為。如果非要使用編譯指令using,應將其放在所有預處理器編譯指令#include之后。(5) 導入名稱時,首選使用作用域解析運算符或using聲明的方法。(6) 對于using聲明,首選將其作用域設置為局部而不是全局。6、總結?開發(fā)程序時使用多個文件,一種有效的組織策略是:使用頭文件來定義用戶類型,為操縱用戶類型的函數提供函數原型。將函數定義放在一個獨立的源代碼文件中。最后,將main()和其他使用這些函數的函數放在第三個文件中。?C++存儲方案決定了變量保存在內存中的時間(存儲持續(xù)性)以及程序哪一部分可以訪問它(作用域和鏈接性)。(1) 自動變量在代碼塊(如函數體或函數體中的代碼塊)中定義的變量。僅當程序執(zhí)行到包含定義的代碼塊時,它們才存在,并且可見。自動變量可以通過使用存儲類型說明符register或根本不使用說明符來聲明。沒有使用說明符,變量默認為自動的。register說明符提示編譯器,該變量的使用頻率很高。(C++11摒棄了這種用法)(2) 靜態(tài)變量在整個程序執(zhí)行期間都存在。對于在函數外面定義的變量,其所屬文件中位于該變量的定義后面的所有函數都可以使用它(文件作用域),并可在程序的其它文件中使用(外部鏈接性)。另一個文件要使用這種變量,必須使用extern關鍵字聲明它。對于文件間共享的變量,應在一個文件中包含其定義聲明(無需使用extern,但如果同時進行初始化,也可以使用它)。并在其他文件中包含引用聲
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- GB/T 32900-2025光伏發(fā)電站繼電保護技術要求
- 2026年瀘州醫(yī)療器械職業(yè)學院單招綜合素質考試題庫及答案詳解一套
- 2026年吉林省長春市單招職業(yè)傾向性考試題庫及答案詳解一套
- 2026年晉中師范高等??茖W校單招職業(yè)技能考試題庫及答案詳解一套
- 2026年廣西理工職業(yè)技術學院單招綜合素質考試題庫帶答案詳解
- 2026年天門職業(yè)學院單招職業(yè)傾向性考試題庫參考答案詳解
- 2026年漢中職業(yè)技術學院單招職業(yè)技能測試題庫及參考答案詳解1套
- 2026年重慶傳媒職業(yè)學院單招職業(yè)適應性考試題庫及完整答案詳解1套
- 2026年寧夏銀川市單招職業(yè)傾向性考試題庫參考答案詳解
- 2026年溫州理工學院單招職業(yè)傾向性測試題庫及參考答案詳解
- 2026年湖南食品藥品職業(yè)學院單招職業(yè)適應性測試題庫帶答案詳解
- 《AQ 4272-2025鋁鎂制品機械加工粉塵防爆安全規(guī)范》專題研究報告
- 2025年度威海文旅發(fā)展集團有限公司招聘工作人員25人筆試參考題庫附帶答案詳解(3卷)
- T-CNHC 4-2025 昌寧縣低質低效茶園改造技術規(guī)程
- 雨課堂學堂在線學堂云《芊禮-謙循-送給十八歲女大學生的成人之禮(中華女子學院 )》單元測試考核答案
- 2025年手術室護理實踐指南試題(含答案)
- 2025年山東省政府采購專家入庫考試真題(附答案)
- 2025兵團連隊職工試題及答案
- 智慧農貿市場建設項目報告與背景分析
- 護理部競選副主任
- 【10篇】新版部編六年級上冊語文課內外閱讀理解專項練習題及答案
評論
0/150
提交評論