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

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

sourabh jaiswal asked 2020-01-13T16:06:42Z
5个解决方案
83 votes

2701029803578360360832关键字在C和C ++中具有相同的作用。

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

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

    如果(正如您对问题的评论所指出的那样)这是您所关心的gets()的唯一用途,那么不,C和C ++之间没有区别。

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

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

  3. C ++在一个类中还有另一个用途,gets()。 在此使用时,它将成为该类的所有对象共有的单个类变量。 一个经典的示例是存储已为给定类实例化的对象数。

正如其他人指出的那样,不赞成使用文件级静态方法,而使用未命名的名称空间。 但是,我认为在将其从语言中删除之前,在某个温暖的地方将会是寒冷的一天-目前使用它的代码太多。 尽管我们都知道这是一个危险的功能,但ISO C只是设法消除了2701029803578360360832。

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

paxdiablo answered 2020-01-13T16:07:44Z
14 votes

在C ++中不建议在文件范围内使用static来限制对当前翻译单元的访问,但在C语言中仍然可以接受。

而是使用未命名的名称空间

namespace
{
    int file_scope_x;
}

以这种方式声明的变量仅在文件中可用,就像声明为静态的一样。

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

最初,这意味着将在程序的生命周期内将此类变量(例如在函数中)存储在此类变量的区域中,而不是像函数局部变量通常那样存储在堆栈中。

然后,关键字被重载以应用于文件作用域链接。 不希望根据需要组成新的关键字,因为它们可能会破坏现有代码。 因此,再次使用该变量具有不同的含义,而不会引起冲突,因为声明为static的变量不能同时在函数内部和顶层使用,并且函数之前没有修饰符。 (在引用函数时,存储含义完全丢失了,因为它们没有存储在任何地方。)

当类在C ++(以及Java和C#)中出现时,再次使用了关键字,但是其含义至少更接近最初的意图。 以这种方式声明的变量存储在全局区域中,而不是像函数变量那样存储在堆栈中,或者像对象成员那样存储在堆中。 因为变量不能同时位于顶级和类定义之内,所以额外的含义可以明确地附加到类变量上。 只能通过类名称或从该类的对象内引用它们。

UncleO answered 2020-01-13T16:08:33Z
9 votes

两种语言的含义相同。

但是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;
Martin York answered 2020-01-13T16:08:58Z
6 votes

请注意,C ++标准仅针对对象(而不是函数)提倡使用静态表示“文件范围”(也称为名称空间范围)。 换一种说法,:

// foo.cpp  
static int x = 0;               // deprecated
static int f() { return 1; }    // not deprecated

引用标准附件D:

使用static关键字是   在声明对象时不推荐使用   命名空间范围。

answered 2020-01-13T16:09:26Z
1 votes

您不能在C中的结构内部声明静态变量。但是在Cpp中,借助作用域解析运算符可以允许它。

同样在Cpp中,静态函数只能访问静态变量,但是在C中,静态函数可以具有静态和非静态变量...😊

Tobin answered 2020-01-13T16:09:51Z
translate from https://stackoverflow.com:/questions/943280/difference-between-static-in-c-and-static-in-c