1. 程式人生 > >C++ STL開發溫習與總結(二): 2.C++儲存技術

C++ STL開發溫習與總結(二): 2.C++儲存技術

 C++ STL開發溫習與總結(二):2.C++儲存技術

      使用了多年C++,沒有系統的溫習總結過,所以準備溫習《C++STL程式設計師開發指南》,本系列篇章將會是溫習總結該書本概念和技術。

      本節討論的C++儲存技術保局哦C++儲存型別,C++儲存修飾符和C++物件的生存期三部分。

1 C++儲存型別

      C++儲存分型別告訴編譯程式如何儲存變數,主要有三種類型extern儲存型別,static儲存型別和register儲存型別。

3-1 extern儲存型別

      由於C語言允許將分別編譯的達程式的各個模組連線在一起,以提高編譯速度,協作大專案管理,因此必須將程式需要的所有全域性變數通過某稱方法告知所有檔案。

      解決上述文件的方法:在一個檔案中說明所有全域性變數,在另一個檔案中使用extern再次描述它們。當在函式內部使用一個全域性變數,而它又是在同一檔案內說明時,可以選用extern,但一般很少這麼做,在C++面向物件程式設計方法當中這種方法幾乎已經不使用,而只是在C語言的原始碼中經常可以看見這種方法的身影。

3-2 static儲存型別

      靜態變數無論在函式中或在檔案中都是穩定的便娘。靜態區域性變數可以使編譯產生與全域性變數相同的永久性儲存區,其差異是靜態區域性變數僅對於說明它的模組內可知。

      將分型別static用於全域性變數,會使編譯器程式建立起僅在說明該全域性變數的檔案中可以認知的全域性變數

3-3 regsiter儲存型別

      regsiter儲存型別僅用於int型和char型別變數(而ANSIC標準拓展了regsiter的定義範圍,使其可用於修飾各種型別比納涼)。通常,regsiter要求編譯程式將它所說明的變數值儲存在CPU的暫存器中,這樣其運算就大大快於普通變數的運算。

      類似陣列那樣的大結構物件顯然不能放在暫存器中,但編譯程式將優化處理他們。

      register僅可用於區域性變數和函式的形式引數,因為這些變數都是預設的自動變數。由於register變數可以提高速度,因此它是最理想的迴圈控制變數。但在實際應用中,由於在同一時刻獲取優化速度的register變數有限(一個函式中所允許的暫存器變數的數目取決於處理器型別以及所指定的C語言的編譯程式),所以,應該將其用到最能發揮作用的地方,如多次引用同一變數的場合。

2 C++儲存修飾符

      用於控制對變數的存取或修改方法的修飾符有:const(常數型)、volatile(暫態型)。

2-1 const-常數型

      const型變數在程式執行期間是不可以改變的(const變數可以賦初值)編譯程式可以隨意將這些變數放到只讀儲存器(Rom)中。

      const變數的用途:可以阻止引數被函式修改,即當一個指標傳送給一個函式後,函式肯呢個修改該指標所指向的變數,如果指標在引數說明段用const修飾,函式就無法修改指標所指的內容了。

      通常,當一個標準庫函式不避修改呼叫引數指引的物件時,引數則用const來描述。const型變數可以被使用者的程式之外的東西修改,例如硬體裝置可以給const變數賦值。

2-2 volatile-暫態型 

      修飾符volatile通知編譯程式:變數值可能由程式中沒有顯示說明的方式所改變。例如:全域性變數的地址可能被傳遞到作業系統的時鐘子程式,用來儲存系統實時時間。

      引用volatile的原因:大多數C編譯程式都假定表示式內部的記憶體不變,並以這一假定來自動優化某些表示式。有些編譯程式在編譯過程中還改變表示式的計算順序,volatile可以防止這些改變的發生。

      const和volatile可以一起使用,例如:如果假定0x30是僅由外部條件改變的埠值,那麼下面說明即可以消除使用者希望防止的所有偶爾副作用。

const volatileunsigned char * port = 0x30;

3 C++物件的生存期

      不同的物件生存期不同。按生存期的物件可分為如下三種:

- 區域性變數:當物件被定義時呼叫建構函式,該物件被建立,當程式退出定義該物件所在的函式或程式塊時,呼叫解構函式,釋放該物件。

- 靜態物件:當程式第一次執行所定義的靜態物件時,該物件被建立,當程式結束時,該物件被釋放。

- 全域性物件:當程式開始時,呼叫建構函式建立該物件,當程式結束時呼叫解構函式釋放該物件。

3-1 類的作用域

      類域,它是指在類的定義中由一對花括號所括起來的部分。每一個類都具有該類的類域,該類的成員區域性在該類所述的類域中。

      在類的定義中可知,類域中可以定義變數,也可以定義函式。從這一點上看類域與檔案域很相似。但是,型別又不同於檔案域,在類域中定義的變數不能使用auto、register、extern等修飾符,只能用static修飾符,而定義的函式也不能 extern等修飾符。另外,在類域中的靜態成員和成員函式還具有外部的連線屬性。

      類域小於檔案域。

3-2 區域性類和巢狀類

      在一個函式提內定義的類成為區域性類。區域性類中只能使用它的外圍作用域中的物件和函式進行聯絡,因為外圍作用域的中的變數與該區域性類的物件無關。在定義區域性類時需要注意:區域性類中不能說明靜態成員函式,並且所有成員函式都必須定義在類體內。在實踐中,區域性類是很少使用的。

int a;
void fun();
{
       staticint a;
       classA { public: void init(int i) {a = i;}
};
A m;
m.init(10);

      在一個類中定義的類成為巢狀類,定義巢狀類的型別為外圍類。定義巢狀類的目的在於隱藏類名,減少全域性的識別符號,從而顯示使用者能否使用該類簡歷物件。這樣可以提高類的抽象能力,並且強調兩個類(外圍類和巢狀類)之間的主從關係。

class A:
{
public:
       classB{public: … private: …};
       voidf();
private:
       int a;
}

      其中,類B是一個巢狀類,類A是外圍類,類B定義在類A的類體內。以下對巢狀類的若干說明:

- 從作用域的角度看,巢狀類被隱藏在外圍類之中,該類名只能在外圍類中使用。如果在外圍類的作用域內使用該類名時,則需要加名字限定。

- 從訪問許可權的角度看,巢狀類名與它的外圍類的物件成員名具有相同的訪問許可權規則。不能訪問巢狀類的私有成員函式,也不能對外圍類的私有部分中的巢狀類建立物件。

- 巢狀類中的成員函式可以在它的類體外定義。

- 巢狀類中說明的成員不是外圍類中物件的成員,反之亦然。巢狀類的成員函式對外圍類的成員沒有訪問許可權,反之依然,在分析巢狀類與外圍類的成員訪問關係時,往往把巢狀類看作非巢狀類來處理。這樣,上述的巢狀類可寫成如下格式:

class A {public : void f(); private: int a;};
class B {public : … private: …}

由此可見,巢狀類僅僅是語法上的嵌入。

- 在巢狀類中說明的友元對外圍類的成員沒有訪問權。

- 如果巢狀類比較複雜,可以只在外圍類中對巢狀類進行說明,關於巢狀的詳細的內容可在外圍類意外的檔案域中進行定義。

相關推薦

C++ STL開發溫習總結 2.C++儲存技術

 C++ STL開發溫習與總結(二):2.C++儲存技術       使用了多年C++,沒有系統的溫習總結過,所以準備溫習《C++STL程式設計師開發指南》,本系列篇章將會是溫習總結該書本概念和技術。       本節討論的C++儲存技術保局哦C++儲存型別,C++儲存

C++ STL開發溫習總結 1.C++程式設計技術

 C++ STL開發溫習與總結(一):1.C++程式設計技術       使用了多年C++,沒有系統的溫習總結過,所以準備溫習《C++STL程式設計師開發指南》,本系列篇章將會是溫習總結該書本概念和技術點。 1概論 l  C++語言是基於C語言的語法基礎上融入了其他語

C++ STL開發溫習總結 3.C++函式技術

C++ STL開發溫習與總結(三): 3.C++函式技術        幾乎所有的C++類都有一個或多個建構函式,一個解構函式和一個賦值操作符。        對於任何一個類A,如果不想編寫上述函式,C++編譯器將自動為A產生4個預設的函式,如下:

Spring核心探索總結Spring容器初始化原始碼探索

Spring容器概述 容器是spring的核心,Spring容器使用DI管理構成應用的元件,它會建立相互協作的元件之間的關聯,負責建立物件,裝配它們,配置它們並管理它們的生命週期,從生存到死亡(在這裡,可能就是new 到 finalize())。 Sprin

Intel IPP密碼庫 IPPCP 2018 開發筆記總結

Part I. 開發指南 內容參考官方文件 《Intel® Integrated Performance Primitives Cryptography Developer Guide, Intel Integrated Performance Primitives 2018》 1. G

前端階段性總結頁面渲染機制效能優化

引言: 轉前端一年了,期間工作較忙,也沒時間整理一些知識體系,此係列文章是對前端基礎的一些回顧與總結。本文主要介紹瀏覽器工作的原理以及一些優化手段。 一、瀏覽器渲染過程 1. 瀏覽器的主要結構: 2. 瀏覽器的多程序模型: 以chorme為例: Browser

工作一年多的感慨總結

前言   前一篇(工作一年多的感慨與總結(一))算是對自己對這一年不如意的地方的一些抱怨與吐槽吧,那麼今天這一篇就總結記錄下那些正能量的事吧(自己能把自己感動的故事),廢話不多說,趁著有足夠的時間回憶,抓緊記錄! 2018/7-2018/9  跳槽準備 (1)人總是要有點資本的   其實從當時的公司入職

Java Web 學習總結Servlet核心介面+Servlet3.0配置

  Servlet3.0版本對Servlet配置進行了重大變革,Servlet類不需要再麻煩的去編輯web.xml檔案了,只需要在類上面進行註釋就可以了,獲得了 Java 社群的一片讚譽之聲,以下是新增的註解支援。 @WebServlet @WebServlet 用於將一個類宣告為 Servlet,該註解

ElasticSearch學習總結ES介紹架構說明

本文主要從概念以及架構層面對Elasticsearch做一個簡單的介紹,在介紹ES之前,會先對ES的“發動機”Lucene做一個簡單的介紹 1. Lucene介紹 為了更深入地理解ElasticSearch的工作原理,特別是索引和查詢這兩個過程,理解Lucene的工作原理至關重要。本

面試心得總結

程式設計師大部分時間都是在解決Bug,當我解決Bug時,總有一種隱隱的感覺,感覺我在尋找迷宮的入口。 我圍著迷宮一直轉圈,每轉一圈,對他越熟悉,越瞭解,就越接近入口。好比最近的非常火的美劇《西部世界》,機器人死千百次,每次都是重複,每次重複都不一樣,

嵌入式軟體開發問題定位總結-----

        今天又碰到一個問題,定位了差不多三天,最終的結果是:bug的出現是因為之前的一段程式碼修改造成的。這個bug的修改給了我啟示:如果出現bug,那麼請先參考一下我的上一篇文章:嵌入式軟體開發問題定位總結-----(一),如果定位不到問題,那麼參考一下下面的定位

測試開發工程師面試總結——演算法篇

演算法也屬於常見面試內容之一,但基本不會超過《劍指offer》的範圍,在此附上一篇簡書上整理的內容: 第二版java解法 常見的面試題包括以下幾類:字串操作,檔案輸入輸出流及統計,矩陣操作,單例模式等。 1.針對字串的操作:如字串反轉、

Elasticsearch全文檢索企業開發記錄總結ES客戶端搭建

專案依賴 <dependency> <groupId>org.elasticsearch.client</groupId> <artifactId>transport<

JVM高級特性實踐對象存活判定算法引用 回收

添加 引用計數器 程序計數器 正文 bmc 進入 block 結構 內存 關於垃圾回收器GC(Garbage Collection),多數人意味它是Java語言的伴生產物。事實上,GC的歷史遠比Java悠遠,於1960年誕生在MIT的Lisp是第一門真正使用內存動態分配和垃

安卓介面基礎知識總結RelativeLayout佈局的常見屬性

1.android:layout_above="@id/xxx"  --將控制元件置於給定ID控制元件之上   android:layout_below="@id/xxx"  --將控制元件置於給定ID控制元件之下 2.android:layout_marginLe

python網路爬蟲web spider系統化整理總結爬蟲python程式碼示例(兩種響應格式json和html)

        上一篇部落格(入門知識篇),對爬蟲有了一個基本的瞭解,但是具體怎麼實現一個爬蟲程式呢?         一般情況下,我們在瀏覽器獲取資訊,是

Spring Boot中使用WebSocket總結向指定使用者傳送WebSocket訊息並處理對方不線上的情況

Spring Boot中使用WebSocket總結(二):向指定使用者傳送WebSocket訊息並處理對方不線上的情況 在上一篇文章(www.zifangsky.cn/1355.html)中我介紹了在Spring專案中使用WebSocket的幾種實現方式。但是,上篇文章中只介紹了服務端採用廣播模式給所有客戶

高並發處理思路手段緩存

這也 也會 多說 訂閱 如果 選型 穿透 分享圖片 需要 傳統web請求流程 一般來說,現在的互聯網應用網站或者APP,它的整體流程可以用我們這個圖裏展示的來表示,用戶請求開始,從這個界面是最裏面的瀏覽器和APP,到網絡轉發,再到應用服務,最後到存儲,這純屬可能是數據

Robot Framework用法總結簡單的用例編寫

3.簡單用例編寫 3.1建立專案New Project 注:選擇directory原因是,在directory的專案下可以建立測試套件,如果是tpye為file,則只能建立測試用例,這不利於用例的管理。 3.2建立測試套件New Suit 右鍵點選Test

JavaWeb學習總結Http協議

一、什麼是HTTP協議   HTTP是hypertext transfer protocol(超文字傳輸協議)的簡寫,它是TCP/IP協議的一個應用層協議,用於定義WEB瀏覽器與WEB伺服器之間交換資料的過程。客戶端連上web伺服器後,若想獲得web伺服器中的某個web資源,需遵守一定的通訊格式,H