2010-02-10 149 views
5

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

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

静态内联函数怎么样?

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

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

+0

您是否具体询问在类/结构之外声明的函数? – Bill 2010-02-10 14:53:00

+0

我一般都在问,谢谢你的评论,但是Brian已经回答了我的问题。 – Dooms101 2010-02-10 15:27:53

回答

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; 
} 

这是一个伟大的功能,如果你有一些是具体到你的类的对象,而不是具体的一个实例使用。

内部功能使用的静态:

如果你声明一个函数内部的变量作为静态的,你可以考虑的变量值将在通话持续。它只会被初始化一次。

例子:

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

我个人尽量避免这种情况,你可能应。拥有全球化的国家并不好。具有相同输入保证相同输出的函数会更好。

就像在英语:

的上下文相关的含义的概念并不具体到C++,你甚至可以看到它在英语语言。

  • 我要screen电影(意味着显示出电影)
  • 电视上的screen坏了(指电视机的一部分)在其他编程语言

其他的含义:

根据编程语言的不同,可能会有不同的含义,但大多数人认为当你说static是第一类vari能够/函数vs成员变量/函数。

+0

最令人困惑的使用静态。他们不能只用'私人'。 – Yacoby 2010-02-10 14:56:53

+0

他们可以但他们会有一个超载的字:私人意义不同的东西:) – 2010-02-10 14:59:21

+1

重复使用关键字听起来确实很愚蠢。这就像使用'auto'来处理不同的事情。哦,等等... – 2010-02-10 15:05:09

3

我在irc.freenode.net上的## C++ irc​​频道上闲逛,我非常喜欢bot nolyc编程给出的关于static的说明。我引用逐字逐句:

当一个函数内部中使用的, static关键字指示 变量共享之间的所有调用函数的 。在 类中使用时,表示变量 或函数是成员,但不是 与特定实例绑定。当在名称空间内使用 时,它指定 内部链接。

我希望能够解决问题。我没有回答你所有的问题。我想说,你应该使用static关键字来完成它打算做的事情。如果它是正确的工作,那么将它用作工具来完成你的任务。就福利而言,我不会担心。如果您需要优化,那么如果没有其他度假村,请考虑这些影响。

我希望这会有所帮助。