C和C++中的static关键字有什么区别?
该static
关键字在C和C++中具有相同的用途.
在文件级别(函数外部)使用时,它会设置应用项目的可见性.静态项目在其编译单元外部不可见(例如,链接器).它们的持续时间与程序的持续时间相同.
这些文件级项(函数和数据)应该是静态的,除非特别需要从外部访问它们(并且几乎从不需要直接访问数据,因为这打破了封装的核心原则).
如果(正如你对问题的评论所指出的那样)这是static
你唯一关心的问题,那么,不,C和C++之间没有区别.
在函数中使用时,它设置项目的持续时间.同样,持续时间与程序相同,并且该项在该函数的调用之间继续存在.
它不会影响该项目的可见性,因为它只在函数中可见.一个示例是随机数生成器,它需要在调用之间保持其种子值,但不希望该值对其他函数可见.
C++ static
在一个类中还有一个用途.在那里使用时,它变成一个单独的类变量,在该类的所有对象中都是通用的.一个经典示例是存储已为给定类实例化的对象数.
正如其他人所指出的那样,不推荐使用文件级静态来支持未命名的命名空间.但是,我相信在它真正从语言中移除之前,在某个温暖的地方会是一个寒冷的日子 - 目前使用它的代码太多了.虽然我们都知道这是一个危险的功能,但ISO C只是刚刚去除了gets()
.
而且,即使它弃用,这并没有改变它的语义现在.
在C++中不推荐在文件范围内使用static来限制对当前转换单元的访问,但在C语言中仍然可以接受.
而是使用未命名的命名空间
namespace { int file_scope_x; }
以这种方式声明的变量仅在文件中可用,就像它们被声明为静态一样.
弃用的主要原因是删除static关键字的几个重载含义之一.
最初,它意味着变量(例如在函数中)将在程序的生命周期中为这些变量提供存储,而不是像函数局部变量那样存储在堆栈中.
然后重载关键字以应用于文件范围链接.根据需要编制新关键字是不可取的,因为它们可能会破坏现有代码.因此,这个被再次使用时具有不同的含义而不会引起冲突,因为声明为static的变量不能同时位于函数内部和顶层,并且函数之前没有修饰符.(当引用函数时,存储内涵完全丢失,因为它们不存储在任何地方.)
当类在C++中(以及在Java和C#中)出现时,关键字再次被使用,但其含义至少更接近于初始意图.以这种方式声明的变量存储在全局区域中,而不是在堆栈中与函数变量相对应,或者在堆上与对象成员相对应.因为变量不能同时位于顶层和类定义内,所以可以明确地将额外含义附加到类变量.它们只能通过类名或该类的对象内引用.
它在两种语言中具有相同的含义.
但是C++增加了类.在类(以及结构)的上下文中,它具有使方法/变量类成员成为对象成员的额外含义.
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;
请注意,使用静态来表示"文件范围"(也称为命名空间作用域)只能通过C++标准对象而不是函数进行详细说明.换一种说法,:
// foo.cpp static int x = 0; // deprecated static int f() { return 1; } // not deprecated
引用标准的附录D:
在命名空间范围内声明对象时,不推荐使用static关键字.