更推荐哪种方法来声明字符串const?
该变量仅在类成员函数中使用。我倾向于认为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)保持全局,那么其他开发人员可以“识别”&amp;修改此字符串。
鉴于上述用例,您是否仍然建议使用函数来返回字符串?或者我可以使用类级静态变量(使用私有访问说明符)?
答案 0 :(得分: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中的静态,那么您可能还希望在类中将其声明为私有,以便其他人无法访问它。
答案 1 :(得分:2)
简单规则:
string
逻辑上属于类,因此它应该是类成员。 static
成员。 这为您提供了以下优势: