我想知道在声明变量并初始化函数或方法之外的值时使用了什么内存空间,例如,
// CBar.h>
class CBar
{
public:
CBar();
~CBar();
};
// CBar.cpp
std::string const NAME = "mr.foo";
CBar::CBar()
{
std::cout << NAME << std::endl;
}
CBar::~CBar()
{
}
我在方法之外声明的NAME变量。声明和初始化此NAME变量是否有任何问题?每次我创建CBAR实例时,NAME变量仍然存在吗?
感谢。
答案 0 :(得分:4)
在您的代码中,NAME是一个静态变量(就像CBar.cpp文件中的全局变量一样)。它在程序的最开始实例化一次,并在整个程序中存活(内存保持分配)。
无论您实例化或删除CBar对象多少次,因此该值/内存始终可以访问(从CBar.cpp中),因为该变量独立于CBar类。
从技术上讲,静态的内存存在于初始化的数据段中。有关内存区域的详细说明,请参阅此答案:Global memory management in C++ in stack or heap?
答案 1 :(得分:2)
NAME变量是全局变量。它存在于main()之前,直到它返回之后。如果以下声明包含在另一个源文件中,它可以从另一个模块链接。
extern std::string const NAME;
如果您不希望允许这样做,您应该如下所示声明它。
static std::string const NAME;
现在它只“污染”CBar.cpp中的标识符名称空间。如果你想避免这种情况,你需要使它成为CBar的私有/受保护成员变量。