2012-08-30 80 views
3

哪種方法可以聲明一個字符串const更值得推薦?靜態全局變量V靜態全局類變量

  1. 是在文件範圍聲明全局變量。
  2. 將其聲明爲全局的類。

該變量將僅用於類成員函數中。我傾向於認爲2更好,因爲它只針對集體成員職能。

A.cpp 
--------------------- 
static const std::string hello_str = "Hello"; 

void A::print() 
{ 
    std::cout << hello_str; 
} 

(OR)

A.h 
--------------------- 
class A{ 
public: 
    static const std::string hello_str; 
    void print(); 
} 

A.cpp 
--------------------- 
const std::string A::hello_str = "Hello"; 

void A::print() 
{ 
    std::cout << A::hello_str; 
} 

編輯-1:

讓我說,串hello_str的內容可以更改。例如。每當他對文件進行更改時,該字符串都由開發人員手動更新。

在這種情況下,將變量初始化保存在函數中是否有意義? 用戶更新字符串可能並不明確。如果它被全局保存到文件(1)或類(2)中,則其他開發人員可以「識別」&修改此字符串。

鑑於上述用例,你還建議有一個函數返回字符串?或者我可以使用類級別的靜態變量(使用私有訪問說明符)?

回答

4

一個匿名的命名空間是另一種選擇:

A.cpp

namespace { 
    const std::string hello_str("Hello"); 
} 

void A::print() { 
    std::cout << hello_str; 
} 

,但你真的應該換行,在延期的初始化函數。

,將採取以下形式:

A.h 
--------------------- 
class A{ 
public: 
    static const std::string& hello_str(); 
    void print(); 
} 

A.cpp 
--------------------- 
const std::string& A::hello_str() { 
    static const std::string str("Hello"); // << constructed on first call of A::hello_str() 
    return str; 
} 

void A::print() { 
    std::cout << A::hello_str(); 
} 
在這種情況下

,你也可以簡單地通過返回值,並完全避免了靜態/全局。你的std C++庫實現可能使用稱爲「小字符串優化」的東西 - 如果是這樣,那麼不需要堆分配來創建或移動字符串。

也注意到你的兩個例子是不一樣的;一個是私有的,另一個是公開可見的。

最終,您應該使用既沒有方法您提出。在一個函數中考慮一個靜態的延遲初始化,或者(在許多情況下甚至更好)通過值返回。

回答你原來的問題:我喜歡在課堂上的聲明,但私人。我發現在事件實施轉移時這更容易維護。當然,如果cpp中的這個靜態對於外部實現來說是可以訪問的,那麼你可能也想在類中聲明它是私有的,這樣其他人就不能訪問它。

+0

我可以解釋「一方有效私密,另一方公開可見」。 - 我認爲兩者都是公開的。 「我贊成在班級內宣佈,但私人。」 - 理解這部分,只有成員func訪問它,而不是從主(其他類的成員函數) 「我發現這更容易維護在事件實現轉移。當然,如果cpp中的靜態是以某種方式外部實現可訪問,那麼你可能也想在類中聲明它是私有的,這樣其他人就無法訪問它。「 - 我可以解釋這個和/或提供一個例子嗎? –

+1

@KingkongJnr這只是一個明顯的例子:在#1中,'static'可以被A.cpp中的任何內容訪問,而不是前面的內容。如果A.cpp只包含A類的定義,那麼它就是我所說的「有效的私人」。可見性和對靜態的訪問是* restricted *。 C程序員使用它的私有函數/數據是一種常見的方法。例如:'main()'無法訪問該靜態,除非主要在A.cpp中定義。 – justin

+0

@KingkongJnr'print',聲明'private'和foo在這裏公開:'class A {\ n public:void foo(); \ n私人:\ n void print(); \ n};' – justin

2

規則很簡單:

  • string邏輯上屬於類,所以它應該是一個類成員。
  • 該類的所有實例共享相同的字符串,因此它屬於類而不是類的特定實例(所有實例共享相同的字符串),因此將其設爲static成員。

這給你的優點是:

  • 只需要訪問字符串類會員將有機會,不像如果聲明它作爲一個全球性的字符串。