我对C++中的static关键字有一些疑问(也可能与其他语言有关.)将函数声明为static的目的是什么?
void static foo(int aNumber) {
... }
Run Code Online (Sandbox Code Playgroud)
静态内联函数怎么样?
void static inline foo(int aNumber) {
... }
Run Code Online (Sandbox Code Playgroud)
将static关键字与函数一起使用有什么好处,这些好处也适用于类函数吗?我意识到在使用旧的编译器进行编译时,某些数据类型(如结构和数组)必须是静态的,但在使用新的ANSI-C++编译器(如MS VC++ 2008)时是否有任何意义?我知道在循环中使用静态变量可以通过将数据保存在内存中而不是每次循环迭代重新分配内存来节省时间,但是当变量只被声明一次时,如在头文件的顶部或命名空间内?
Bri*_*ndy 15
取决于上下文:
像C++中的许多东西一样,static
取决于它的上下文意味着不同的东西.
在C++中,同一个词根据其上下文表示不同的东西是很常见的.
例如:
*
用于乘法,解除引用指针和创建指针. &
用于获取变量的地址,声明引用,以及作为按位AND运算符.全局使用静态:
如果在类和全局范围之外将函数或变量声明为静态,则它仅特定于该文件.如果您尝试在不同的文件中使用该变量或函数(通过前向声明),您将收到链接错误.
例:
a.cpp:
static void fn()
{
cout<<"hello a!"<<endl;
}
Run Code Online (Sandbox Code Playgroud)
b.cpp:
void fn();
void gn()
{
fn();//causes linking error
}
Run Code Online (Sandbox Code Playgroud)
此功能允许您使用其他任何文件都看不到的函数,这样就不会导致多次定义符号的链接器错误.执行此操作的首选方法是使用匿名命名空间:
a.cpp:
namespace
{
void fn() // will be static to a.cpp
{
cout<<"hello a!"<<endl;
}
}
Run Code Online (Sandbox Code Playgroud)
一个类里面使用静态:
如果在类(或结构)中将函数或变量声明为static,则它是类函数或类变量.这意味着整个班级只有一个.类函数只能使用类变量.类变量在该类的所有实例之间共享.
class C
{
public:
static void fn()
{
y = 4;//<--- compiling error
// can't access member variable within a static function.
}
int y;
}
Run Code Online (Sandbox Code Playgroud)
如果您拥有特定于对象类的内容但不特定于实例,则可以使用此功能.
在函数内部使用static:
如果在函数内部将变量声明为静态,则可以认为变量值将在调用时保持不变.它只会被初始化一次.
例:
//Will print 0, then 1, then 2, ...
void persistentPrintX()
{
static int x = 0;
cout << x << endl;
x++;
}
Run Code Online (Sandbox Code Playgroud)
我个人试图避免这种情况,你可能应该这样做.拥有全球国家并不好.具有相同输入的函数最好保证相同的输出.
就像在英语中一样:
上下文敏感含义的概念并非特定于C++,您甚至可以在英语中看到它.
screen
电影(手段显示电影)screen
的电视机坏上(表示TV的一部分)其他编程语言的其他含义:
根据编程语言的不同,可能有不同的含义,但大多数人在你说的时候首先想到的static
是类变量/函数与成员变量/函数.