静态全局变量V静态全局类变量
哪种方法来声明一个字符串const更值得推荐?
该变量将仅用于类成员函数中。 我倾向于认为2更好,因为它只针对集体成员职能。
A.cpp
---------------------
static 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 = "Hello";
void A::print()
{
std::cout << A::hello_str;
}
编辑-1:
让我说,hello_str的内容可以改变。 例如。 该字符串由开发人员在更改文件时手动更新。
在这种情况下,将变量初始化保存在函数中是否有意义? 用户更新字符串可能并不明确。 如果它被全局保存到文件(1)或类(2)中,则其他开发人员可以“识别”并修改该字符串。
鉴于上述用例,你是否仍然建议有一个函数来返回字符串? 或者我可以使用类级别的静态变量(使用私有访问说明符)?
匿名命名空间是另一种选择:
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中的这个静态对于外部实现来说是可以访问的,那么你可能也想在类中声明它是私有的,这样其他人就不能访问它。
简单的规则:
string
逻辑上属于类,所以它应该是一个类成员。 static
成员。 这给你的好处是:
上一篇: static global variable V static global Class variable
下一篇: C++ static variable