gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:53:51 25 4
gpt4 key购买 nike

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

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

静态内联函数怎么样?

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

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

最佳答案

取决于上下文:

与 C++ 中的许多事物一样,static 根据其上下文表示不同的事物。

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

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

静态的全局使用:

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

例子:

a.cpp:

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

b.cpp:

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

此功能允许您使用其他文件永远看不到的函数,这样您就不会导致多次定义的符号可能出现链接器错误。执行此操作的首选方法是使用匿名 namespace :

a.cpp:

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

类内部使用静态:

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

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

我个人尽量避免这种情况,您可能应该这样做。拥有全局状态并不好。最好是具有给定相同输入保证相同输出的函数。

就像英语一样:

context sensitive meaning这个概念并不是C++特有的,你甚至可以在英语中看到它。

  • 我要放映一部电影(意思是放映电影)
  • 电视上的屏幕坏了(指电视的一部分)

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

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

关于c++ - 关于带有函数和数据的static关键字的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2237603/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com