在C++中使用成员变量或静态变量
Use member variable or static variable in C++?
我有一个变量,它只在一个函数中使用。变量应该在函数调用之间保持其值,因此它应该是静态变量。有两种方法可以实现它。一种是将它声明为成员变量:
class A{
private:
void foo();
int i;
}
// i is initialized to 0 in constructor
void A::foo()
{
i++;
if (i > 5)
i = 0;
}
另一种是在函数中声明一个静态变量:
void A::foo()
{
static int i;
i++;
if (i > 5)
i = 0;
}
我想知道你更喜欢用哪一种。不涉及比赛条件。
我在这个问题中看到了一个误解:第一个问题没有声明变量static
。只有第二个能做到。在第一种情况下,变量是实例变量,即类的不同实例将有自己的变量,但在第二种情况下它是(通常称为)类变量,这意味着它由所有实例共享。在提出任何进一步的问题之前,您必须先了解这种差异。
至于哪一个更好,取决于你想如何/为什么使用它,从你的问题中还不清楚。也不清楚为什么要使用类和非静态成员函数。
在成员函数内创建静态变量时,该类的所有实例都共享同一个变量。例如:
void Foo::foo()
{
static int i = 0;
std::cout << ++i;
}
// ...
Foo foo, foo2;
foo.foo(); // i = 1
foo2.foo(); // i = 2
但是,没有静态关键字的数据成员对于类的每个实例都是不同的变量。因此,如果您不介意实例共享同一个变量,请使用第二个示例,否则,请使用第一个示例。
当您想在没有类实例的情况下访问静态变量或在多个实例之间共享它时,可以使用静态变量。当您希望每个类实例都有自己的变量副本时,可以使用成员变量。
希望这能有所帮助。
如果在类内声明实例变量,则会产生以下效果:
- 必须初始化构造函数中的变量
- 类中的任何方法都可以访问和更改该变量
- 如果实例化多个类变量,它们都将具有i的单独副本
如果在成员函数中使用静态变量,则:
- 您可以在使用变量的位置对其进行初始化
- 类中没有其他方法可以访问/更改该值
- 在类的所有实例化中都有一个共享值
这些显然是由编译器以不同的方式实现的,但除非您能够用探查器表明这是性能的瓶颈,否则您不应该担心这一点。相反,要担心你的预期行为以及你真正想要的情况。
相关文章:
- 在 .h 文件中的类中声明静态变量和在.cpp文件中声明"global"变量有什么区别
- 模板基类中的静态变量
- 类和静态变量
- 不同作用域中的静态变量和全局变量
- 静态变量声明和定义
- 是否可以依赖函数范围的静态变量来执行程序关闭期间调用的方法?
- 在类中继承静态变量?
- "local scope"中的 C++ 初始化静态变量
- 使用静态变量的递归调用的不同输出
- 静态 constexpr 类成员变量对多线程读取是否安全?
- C++:是否可以使用非静态成员变量模板?
- 复制文件流C++静态变量
- 如何在复杂继承中访问静态成员变量
- 为什么静态数组成员变量在调用对象的实例后不显示任何内容?
- 跨模板化函数编译的静态变量
- constexpr函数中的静态constexpr变量
- 静态成员变量不会由 gettext 转换
- 从 exe 和 dll 访问静态库中的 extern 变量
- 如果包含映射的静态库与可执行文件和动态库链接,静态映射(变量)是否会被多次释放?
- 用于定义公共变量静态常量整数的C++标准