C++ 静态全局变量V静态全局类变量
更推荐哪种方法声明字符串常量C++ 静态全局变量V静态全局类变量,c++,static,global-variables,C++,Static,Global Variables,更推荐哪种方法声明字符串常量 是在文件范围内声明全局变量 将其声明为类的全局 该变量将仅在类成员函数中使用。我倾向于认为2更好,因为它只针对类成员函数 A.cpp --------------------- static const std::string hello_str = "Hello"; void A::print() { std::cout << hello_str; } A.cpp --------------------- 静态常量std::string
A.cpp
---------------------
static const std::string hello_str = "Hello";
void A::print()
{
std::cout << hello_str;
}
A.cpp
---------------------
静态常量std::string hello\u str=“hello”;
void A::print()
{
标准::cout简单规则:
字符串
在逻辑上属于类,因此它应该是类成员
- 该类的所有实例共享同一字符串,因此它属于该类,而不是该类的特定实例(所有实例共享同一字符串),因此将其设置为
静态
成员
这为您提供了以下优势:
- 只有需要访问该字符串的类成员才具有访问权限,这与将其声明为全局字符串不同
匿名命名空间是另一种选择:
A.cpp
名称空间{
常量std::字符串hello_str(“hello”);
}
void A::print(){
std::你能解释一下“一个是有效私有的,另一个是公共可见的。”-我认为1和2都是公共的。“我赞成类内的声明,但私有。”-理解这一部分,只有成员func访问它,而不是从main(其他类的成员func)访问它)“我发现在实现发生变化的情况下,这更容易维护。当然,如果cpp中的静态可以通过某种方式被外部实现访问,那么您可能还希望在类内将其声明为私有,以便其他人无法访问它。“-你能解释一下这一点和/或给我举个例子吗?@KingkongJnr这只是一个明显的例子:在#1中,静态
可以被A.cpp中不在它前面的任何东西访问。如果A.cpp只包含A类的定义,那么它就是我所说的“有效私有”。对静态的可见性和访问受到限制。这是C程序员用于其私有函数/数据的常用方法。例如:main()
无法访问该静态,除非在a.cpp中定义了main。@KingkongJnrprint
,声明了private
,而foo在这里是公共的:class a{\n public:void foo();\n private:\n void print();\n};
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;
}
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();
}