2012-08-30 180 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成员。

这给你的优点是:

  • 只需要访问字符串类会员将有机会,不像如果声明它作为一个全球性的字符串。