C中静态与C ++静态之间的区别?

C和C ++中的static关键字有什么区别?

static关键字在C和C ++中的用途相同。

  1. 在文件级别(在函数之外)使用时,它将设置应用项目的可见性。 静态项目在其编译单元之外(例如链接器)是不可见的。 它们的持续时间与程序的持续时间相同。

    这些文件级别的项目(函数和数据)应该是静态的,除非有特定的需求从外部访问它们(并且几乎从不需要直接访问数据,因为这打破了封装的核心原则)。

    如果(就像你对这个问题的评论所指出的那样)这是你关心的唯一的static使用,那么不,C和C ++没有区别。

  2. 在函数中使用时,它设置项目的持续时间。 同样,持续时间与程序相同,并且在该函数的调用之间该项目继续存在。

    它不会影响该项目的可见性,因为它只在该函数内可见。 一个例子是一个随机数生成器,需要在调用之间保持其种子值,但不希望其他函数可见。

  3. C ++有一个更多的用途,在一个类中是static的。 在那里使用的时候,它变成了这个类的所有对象中通用的单个类variables。 一个典型的例子是存储已经为给定类实例化的对象的数量。

正如其他人所指出的那样,文件级静态的使用已被弃用,以支持未命名的名称空间。 但是,我相信在一个温暖的地方,这个天气真的被从语言中删除了 – 现在的代码太多了。 而ISO C 只是得到了去除get gets()尽pipe我们都知道这是一个危险的function。

即使它已被弃用,现在也不会改变它的语义。

在文件范围内使用静态来限制对当前翻译单元的访问在C ++中被弃用,但在C中仍然是可以接受的。

相反,请使用未命名的名称空间

 namespace { int file_scope_x; } 

以这种方式声明的variables只在文件中可用,就像它们被声明为静态一样。

弃用的主要原因是删除static关键字的几个重载意义之一。

最初,这意味着variables(例如函数中的variables)将被存储在程序的整个生命周期中,而不是像函数局部variables一样存储在堆栈中。

然后关键字被重载以适用于文件范围链接。 根据需要组合新的关键字是不可取的,因为它们可能破坏现有的代码。 所以这个被再次使用了一个不同的含义而不会引起冲突,因为一个被声明为静态的variables不能同时在函数内和顶层,而函数之前没有修饰符。 (当涉及function时,存储内容完全丢失,因为它们不存储在任何地方)。

当C ++(以及Java和C#)出现类时,关键字又被使用了,但其含义至less更接近于原意。 以这种方式声明的variables存储在全局区域中,而不是堆栈中的函数variables,或堆中的对象成员。 因为variables既不能位于顶层,也不能位于类定义的内部,所以额外的含义可以毫不含糊地附加到类variables上。 它们只能通过类名或类内的对象引用。

两种语言的意思都是一样的。

但是C ++增加了类。 在一个类(因此是一个结构)的上下文中,它具有使方法/variables类成员相当于对象成员的额外含义。

 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关键字。

你不能在C中的结构中声明一个静态variables,但是可以在范围parsing运算符的帮助下在Cpp中允许。

另外在Cpp中静态函数只能访问静态variables,而在C静态函数中可以有静态variables和非静态variables…😊