C中的static与C中的static之间的差异++;?? < C和C++中的静态关键字有什么区别?

C中的static与C中的static之间的差异++;?? < C和C++中的静态关键字有什么区别?,c++,c,C++,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; } };

在两种语言中都有相同的含义。

<>但是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;

<> >代码> static < /Cord>关键字在C和C++中的作用相同。

  • 在文件级(函数外部)使用时,它设置应用于的项的可见性。静态项在编译单元之外不可见(例如,链接器)。它们的持续时间与节目的持续时间相同。

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

    如果(如您对问题的注释所示),这是<>代码>静态< /代码>的唯一用途,那么,C和C++之间没有区别。

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

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

  • C++还有一个用途,
    static
    在类中。在那里使用时,它将成为一个在该类的所有对象中通用的类变量。一个典型的例子是存储已为给定类实例化的对象数

  • 正如其他人所指出的,文件级静态的使用已经被弃用,取而代之的是未命名的名称空间。然而,我相信在它真正从语言中删除之前,在某个温暖的地方会是寒冷的一天——现在有太多的代码在使用它。ISO C刚刚开始删除
    get()
    ,尽管我们都知道这是一个危险的函数


    虽然它已经被弃用,但它现在没有改变它的语义。

    < P>在C++中,在文件范围内使用静态限制对当前翻译单元的访问被禁止,但在C.</P>中仍然可以接受。 相反,请使用未命名的命名空间

    namespace
    {
        int file_scope_x;
    }
    
    以这种方式声明的变量仅在文件中可用,就像它们被声明为静态一样

    不推荐使用的主要原因是删除static关键字的几个重载含义之一

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

    然后重载关键字以应用于文件范围链接。根据需要创建新的关键字是不可取的,因为它们可能会破坏现有的代码。因此,这个变量再次被用在了另一个意义上,没有引起冲突,因为声明为static的变量不能同时在函数内部和顶层,而且函数以前没有修饰符。(在引用函数时,存储内涵完全丢失,因为它们没有存储在任何地方。)


    当C++中的类出现时(java和c*),关键字又被使用,但是意思至少更接近原始意图。以这种方式声明的变量存储在全局区域中,而不是函数变量存储在堆栈中,或者对象成员存储在堆中。因为变量不能同时位于顶级和类定义内部,所以可以明确地将额外的含义附加到类变量上。它们只能通过类名引用或从该类的对象中引用。

    注意到,使用静态来表示“文件范围”(AkA命名空间范围)只被C++标准对对象而不是函数所废除。换言之:

    // foo.cpp  
    static int x = 0;               // deprecated
    static int f() { return 1; }    // not deprecated
    
    引用本标准附录D:

    static关键字的用法是 在中声明对象时已弃用 命名空间范围


    您不能在C中声明结构内部的静态变量。。。但在范围解析操作符的帮助下,在Cpp中允许


    此外,在Cpp中,静态函数只能访问静态变量,但在C中,静态函数可以有静态变量和非静态变量……我不是在问类成员(数据或函数)的静态部分。C和C++ C++?DUP中定义的静态变量中的语义变量有什么区别:但是在C++中使用顶层静态是不可取的。它在C语言中是可以接受的。它肯定是不推荐的(附件D.2),但是,它只是不推荐用于命名空间范围内的对象。这个额外的意义类似于静态的所有意义。关键字影响变量在所有场景(文件、函数或类)中的可见性和持续时间。所有这些场景背后都有相同的规则。关于“导出”关键字值得一读。导出的一个意外副作用是,在一个翻译单元中导出的模板可以引用未命名名称空间中的对象和函数!它实际上提出了一个可能性,即C++委员会将不得不在命名空间对象上重新声明静态,因为它没有,就无法确保这些变量对其他翻译单位是不可见的。应该注意到,文件范围静态的弃用被移除为C++ 11,尽管它仍然不能用于类型。不过,将来可能会有更多的更改。虽然在限制文件可见性方面,文件级别的静态与未命名名称空间的作用相同,但有一点不同。静态的具有内部链接,而未命名的命名空间具有外部链接(但由于名称混乱,仍然不可访问)