Difference between static in C and static in C++??
C和C++中静态关键字之间的区别是什么?
EDCOX1的0个关键字在C和C++中的作用相同。
在文件级(在函数外部)使用时,它设置应用于的项的可见性。静态项在其编译单元之外不可见(例如,对于链接器)。它们的持续时间与程序的持续时间相同。这些文件级项目(函数和数据)应该是静态的,除非有从外部访问它们的特定需求(而且几乎不需要直接访问数据,因为这打破了封装的中心原则)。如果(正如你对这个问题的评论所指出的),这是EDOCX1的唯一用法0。你关心的是,没有,C和C++之间没有区别。
在函数中使用时,它设置项的持续时间。同样,持续时间与程序相同,并且在调用该函数之间该项继续存在。它不会影响该项的可见性,因为它只在函数中可见。一个例子是一个随机数生成器,它需要在调用之间保持其种子值,但不希望该值对其他函数可见。
C++在一个类中还有一个用法,EDCOX1 0。当在那里使用时,它将成为一个单一的类变量,在该类的所有对象中都是通用的。一个经典的例子是存储为给定类实例化的对象的数量。
正如其他人指出的那样,文件级静态的使用已经被弃用,取而代之的是未命名的命名空间。然而,我相信在某个温暖的地方,这将是一个寒冷的日子,在它真正从语言中删除之前——现在使用它的代码太多了。尽管我们都知道这是一个危险的功能,但iso c只是在移除
尽管它被弃用了,但现在它的语义并没有改变。
在C++中禁止在文件范围内使用静态限制对当前翻译单元的访问,但在C.仍然可以接受。
相反,使用未命名的命名空间
1 2 3 4 | namespace { int file_scope_x; } |
以这种方式声明的变量只在文件中可用,就像它们被声明为静态的一样。
拒绝使用的主要原因是删除静态关键字的几个重载含义之一。
最初,它意味着变量(比如函数中的变量)将在程序的生命周期内被存储在此类变量所在的区域中,而不是像函数局部变量那样存储在堆栈中。
然后重载关键字以应用于文件范围链接。不希望根据需要编写新的关键字,因为它们可能会破坏现有的代码。所以这一个被再次使用,有着不同的含义而不会引起冲突,因为声明为static的变量不能同时在函数内部和顶层,并且函数以前没有修饰符。(在引用函数时,存储内涵完全丢失,因为它们不存储在任何位置。)
当类出现在C++中(在Java和C语言中),关键字又被使用了,但是意思至少更接近原始意图。以这种方式声明的变量存储在全局区域中,而不是存储在堆栈中的函数变量中,或存储在堆中的对象成员中。因为变量不能既在顶级又在类定义中,额外的含义可以明确地附加到类变量上。它们只能通过类名或从该类的对象中引用。
它在两种语言中都有相同的含义。
但是C++增加了类。在类(因此是结构)的上下文中,它具有使方法/变量类成员成为对象成员的额外含义。
1 2 3 4 5 6 7 8 9 10 11 12 | class Plop { static int x; // This is a member of the class not an instance. public: static int getX() // method is a member of the class. { return x; } }; int Plop::x = 5; |
注意,使用静态来表示"文件范围"(AkA命名空间范围)只被C++标准对对象而不是函数所废除。换句话说,是:
1 2 3 | // foo.cpp static int x = 0; // deprecated static int f() { return 1; } // not deprecated |
引用本标准附件D:
The use of the static keyword is
deprecated when declaring objects in
namespace scope.
不能在C中声明结构内部的静态变量。但在范围解析操作符的帮助下,cpp中允许。
同样,在cpp中静态函数只能访问静态变量,但在c中静态函数可以有静态和非静态变量…??