2009-06-15 69 views

回答

90

我相信你的意思是

爲什麼常量意味着內部鏈接在C++

這是真的,如果你在命名空間內聲明一個const對象,那麼它有內在聯繫。

附錄C給出的理由

變化:是顯式聲明的常量,並沒有明確聲明爲extern文件範圍的名稱具有內在聯繫,而在C中,它會對外部鏈接

理由:因爲const對象可以用作C++中的編譯時間值,所以這個特性促使程序員爲每個const提供顯式的初始化值。此功能允許用戶將常量對象放在包含在許多編譯單元中的頭文件中。

+0

的理性有助於完美解釋.. – FaceBro 2016-03-10 00:40:06

+0

似乎非const全局對象也可以初始化,但爲什麼標準不給它內部鏈接? – 2017-09-15 07:54:58

-3

它沒有。編寫如下:

const int i = 0; 

不作i靜態的(用C或C++)。

3

這些概念是正交的,不應該被認爲是同一件事。

Constness是一個訪問權限:它只會告訴你的變量是隻讀的(const)還是write-read(非const)。

靜態是一種生命時間(和技術上的內存本地化)屬性:它告訴變量是否在類的範圍內是全局的(當在類中)或翻譯單元(當與全局變量一起使用時在cpp中)。

-1

它沒有,最明顯的例子是,如果你有一個const成員變量(當然是由構造函數初始化),它不會被該類的所有對象共享,而是個體每一個。

class A { 
public: 
    A(int newx) : x(newx); 
private 
    int x; 
} 

litb給出了上面的最佳答案。

6

在C & C++術語靜態具有多重含義(可以管理連接和存儲) 你必須讀Stroustrup的d & E至欣賞他的理由 - 但是當你聲明一個變量是在命名空間範圍常量它自動具有內部鏈接 - 而在C中,你必須聲明它是靜態的,以強制它具有內部鏈接。

當然在C++中,使用靜態控制聯動已棄用中,匿名命名空間可被用來模擬在C++中的內部鍵。在C++

const的變量應該更換預處理器常數 - 而且由於預處理器常量僅在定義它們的文件可見,同樣,常量自動使變量可見只有在定義它的文件。

9

正如litb說,const對象具有內部鏈接。這是因爲它們旨在以如下方式使用:

// a.cpp 
const int BUFSIZE = 100; 
char abuf[BUFSIZE]; 

// b.cpp 
const int BUFSIZE = 256 
int bbuf[BUFSIZE]; 
4

Const和static在C和C++中都是正交的概念。

const關鍵字告訴編譯器從呈現爲任何表達的左值禁止可變 - 基本上使它只讀的。

在C中,static關鍵字取決於它適用於有幾個用途。當應用於函數的變量時,它表示該變量未存儲在函數的本地範圍中,但可通過調用對其進行訪問。當應用於全局變量或函數時,它只能被特定文件訪問 - 換句話說,它只能在編譯單元內訪問(除非聲明爲extern)。

在C++中,static關鍵字可以在類定義中使用,使一個變量或函數共享橫跨類的所有實例,而不是本地的每個實例。此外,C++中的靜態類函數只能訪問該類的靜態變量(或它可以訪問的類)。現在,在C++ const確實給會員內部鏈接到編譯單元,除非他們明確地聲明extern - 這可能是你所指的。這允許通過使用頭文件在單元之間共享編譯時常量。但請記住,成員並不是真正的靜態 - 而是常量是編譯到每個位置被引用。

相關問題