哪种声明字符串常量的方式更推荐?
- 是在文件范围内声明全局变量。
- 将其声明为全局类。
该变量将仅在类成员函数中使用。我倾向于认为 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) 保持全局,则其他开发人员可以“识别”和修改此字符串。
鉴于上述用例,您是否仍然建议使用返回字符串的函数?或者我可以使用类级别的静态变量(带有私有(private)访问说明符)吗?
最佳答案
匿名命名空间是另一种选择:
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();
}
在这种情况下,您也可以简单地按值返回,并完全避免静态/全局。您的标准 C++ 库实现可能会使用所谓的“小字符串优化”——如果是这样,则不需要分配堆来创建或移动这么短的字符串。
另请注意,您的两个示例并不相同;一个实际上是私有(private)的,另一个是公开可见的。
最终,您应该不使用您建议的方法。考虑在函数中使用 static 进行延迟初始化,或者(在许多情况下甚至更好)按值返回。
回答你原来的问题:我赞成类内的声明,但私有(private)的。我发现这在事件实现发生变化时更容易维护。当然,如果外部实现可以以某种方式访问 cpp 中的静态,那么您可能还想在类中将其声明为私有(private),这样其他人就无法访问它。
关于c++ - 静态全局变量 V 静态全局类变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12190100/