关于带有函数和数据的static关键字的问题

时间:2010-02-10 14:48:21

标签: c++ static

我对C ++中的static关键字有一些疑问(也可能与其他语言有关。)将函数声明为静态的目的是什么?

void static foo(int aNumber) {
... }

静态内联函数怎么样?

void static inline foo(int aNumber) {
... }

将static关键字与函数一起使用有什么好处,这些好处也适用于类函数吗? 我意识到在使用旧的编译器进行编译时,某些数据类型(如结构和数组)必须是静态的,但在使用新的ANSI-C ++编译器(如MS VC ++ 2008)时是否有任何意义?我知道在循环中使用静态变量可以通过将数据保存在内存中而不是每次循环迭代重新分配内存来节省时间,但是当变量只被声明一次时,如在头文件的顶部或命名空间内?

2 个答案:

答案 0 :(得分:15)

取决于背景:

与C ++中的许多内容一样,static根据其上下文意味着不同的东西。

在C ++中,同一个词根据其上下文来表示不同的东西是很常见的 例如:

  • *用于乘法,解除引用指针和创建指针。
  • &用于获取变量的地址,声明引用,以及作为按位AND运算符。

全球使用静态

如果在类和全局范围之外将函数或变量声明为静态,则它仅特定于该文件。如果您尝试在不同的文件中使用该变量或函数(通过前向声明),您将收到链接错误。

示例:

a.cpp:

static void fn()
{
  cout<<"hello a!"<<endl;
}

b.cpp:

void fn();
void gn()
{
  fn();//causes linking error
}

此功能允许您使用其他文件无法看到的功能,这样就不会导致多次定义符号的链接器错误。执行此操作的首选方法是使用匿名命名空间:

a.cpp:

namespace
{
  void fn() // will be static to a.cpp
  {
    cout<<"hello a!"<<endl;
  }
}

使用静态类的内部:

如果在类(或结构)中将函数或变量声明为静态,则它是类函数或类变量。这意味着整个班级只有一个。类函数只能使用类变量。类变量在该类的所有实例之间共享。

class C
{
public:
  static void fn()
  {
    y = 4;//<--- compiling error
    // can't access member variable within a static function.
  }

  int y;
}

如果您拥有特定于对象类的内容但不特定于实例,则可以使用此功能。

在函数内部使用static:

如果在函数内部将变量声明为静态,则可以认为变量值将在调用时保持不变。它只会被初始化一次。

示例:

//Will print 0, then 1, then 2, ...
void persistentPrintX()
{
  static int x = 0;
  cout << x << endl;
  x++;
}

我个人试图避免这种情况,你可能应该这样做。拥有全球国家并不好。最好让具有相同输入的函数保证相同的输出。

就像英语一样:

上下文敏感含义的概念并非特定于C ++,您甚至可以在英语中看到它。

  • 我要去screen看一部电影(表示电影的意思)
  • 电视上的screen已损坏(意味着电视的一部分)

其他编程语言的其他含义:

根据编程语言的不同,可能有不同的含义,但大多数人在说static时首先想到的是类变量/函数与成员变量/函数。

答案 1 :(得分:3)

我在irc.freenode.net上的## c ++ irc​​频道上闲逛,我真的很喜欢bot nolyc编程给出的静态澄清。我一字不漏地引用:

  

在函数内部使用时,   static关键字表示a   变量在所有调用之间共享   功能。在里面使用时   class,它表示变量   或功能是成员但不是   绑定到特定实例。什么时候   在命名空间内使用,它指定   内部联系。

我希望能够解决问题。我没有回答你的所有问题。我会说你应该使用static关键字来做它想要做的事情。如果它是适合工作的任务,可以将它作为工具来完成你的任务。就收益而言,我不担心。如果你需要优化,那么在没有其他手段的情况下考虑这些影响。

我希望这会有所帮助。