C++ Primer Plus學習:第九章

C++第九章:內存模型與名稱空間

C++在內存中存儲數據方面提供了多種選擇。可直接選擇保留在內存中的時間長度(存儲持續性)以及程序哪一部分能夠訪問數據(做用域和連接)等。函數

  • 單獨編譯

程序分爲三個部分:fetch

  • 頭文件:包含結構聲明和使用這些結構的函數原型。
  • 源代碼文件:包含於結構有關的函數代碼
  • 源代碼文件:包含調用與結構有關的函數代碼

通常頭文件中不包含函數定義與變量聲明。若是程序的兩個文件均包含該文件會錯誤。優化

頭文件中一般包含的內容:spa

  • 函數原型
  • 使用#defineconst定義的符號變量
  • 結構聲明
  • 類聲明
  • 模板聲明
  • 內聯函數

包含自定義的頭文件時使用雙引號。內存

如:#include"myheader.h" 作用域

不能使用尖括號,若是使用尖括號,C++編譯器將在存儲標準頭文件的主機系統的文件系統中查找。原型

1.2 頭文件管理

在同一個文件中只能將頭文件包含一次,爲了防止重複包含,在頭文件中包含頭文件採用以下技術:編譯器

#ifndef FILENAME_H_ 編譯

#define FILENAME_H_ table

//place include file contents here

#endif

  • 存儲持續性、做用域和連接性

做用域:描述了名稱在多大範圍內可見。

連接性:描述名稱如何在不一樣單元間共享

自動存儲持續性:函數中聲明的參數與變量。做用域爲局部,沒有連接性。

全局變量與局部變量能夠同名,在局部變量定義的代碼塊中,全局變量被屏蔽。

自動變量被存放在棧中,棧是一種後進先出(LIFO)的結構。

靜態持續變量:外部連接性,內部連接性與無連接性。

1)外部連接性:即全局變量,外部文件可訪問,在函數外定義。整個程序只能有一個同名的外部變量,同一程序的不一樣文件不能定義同名的外部變量。

2)內部連接性:在函數外定義,使用關鍵字static。做用域爲整個文件。

3)無連接性:在代碼塊內部定義,使用關鍵字static。做用域爲代碼塊,生存週期爲整個函數。

靜態變量均爲零初始化的,即若沒賦初值,則系統自動賦爲零。

其餘文件引用本文件的全局變量必須使用extern關鍵字。如:extern 數據類型 全局變量標識符。

無連接性的靜態變量做用域在代碼塊中,可是生存週期爲整個程序,並且值保持不變。且定義和初始化只進行一次,第二次調用時,跳過初始化。

限定符:const和volatile。

說明符:auto,register,static,extern,thread_local,mutable。

volatile:不進行優化,將某變量存入寄存器。

mutable:容許修改const的結構成員。

例:struct data{mutable int a};

const data veep={…};veep.a=10; //a的值可被修改

const規定了全局變量爲內部連接性,不可在不一樣文件中共享,但可以使用extern覆蓋。

在函數或者代碼塊中定義const常量的話,做用域爲代碼塊。

函數不能夠嵌套定義,

使用new運算符初始化:

int *pi=new int (6);

定位new運算符:

例:char buffer1[50];

int *p2;

p2=new (buffer1) int;

爲p2分配buffer1中的一塊存儲區域。

名稱空間

聲明區域:能夠在其中進行聲明的區域,如全局變量爲整個文件,局部變量爲所在的代碼塊。

潛在做用域:從聲明區域開始,到聲明區域的結尾。

做用域:變量對程序可見的範圍

namespace Jack{double pail,…}

名稱空間能夠是全局的,可也以位於另外一個名稱空間中,但不能位於代碼塊中。

using聲明:由被限定的名稱和它前面的關鍵字using構成,如:using Jill::fetch;不支持重名。

using編譯指令:using namespace Jill;在代碼塊中支持重名。

未命名的名稱空間的潛在做用域爲從聲明點到該聲明區域的末尾。

相關文章
相關標籤/搜索