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

Difference between static in C and static in C++??

C和C++中静态关键字之间的区别是什么?


EDCOX1的0个关键字在C和C++中的作用相同。

  • 在文件级(在函数外部)使用时,它设置应用于的项的可见性。静态项在其编译单元之外不可见(例如,对于链接器)。它们的持续时间与程序的持续时间相同。这些文件级项目(函数和数据)应该是静态的,除非有从外部访问它们的特定需求(而且几乎不需要直接访问数据,因为这打破了封装的中心原则)。如果(正如你对这个问题的评论所指出的),这是EDOCX1的唯一用法0。你关心的是,没有,C和C++之间没有区别。

  • 在函数中使用时,它设置项的持续时间。同样,持续时间与程序相同,并且在调用该函数之间该项继续存在。它不会影响该项的可见性,因为它只在函数中可见。一个例子是一个随机数生成器,它需要在调用之间保持其种子值,但不希望该值对其他函数可见。

  • C++在一个类中还有一个用法,EDCOX1 0。当在那里使用时,它将成为一个单一的类变量,在该类的所有对象中都是通用的。一个经典的例子是存储为给定类实例化的对象的数量。

  • 正如其他人指出的那样,文件级静态的使用已经被弃用,取而代之的是未命名的命名空间。然而,我相信在某个温暖的地方,这将是一个寒冷的日子,在它真正从语言中删除之前——现在使用它的代码太多了。尽管我们都知道这是一个危险的功能,但iso c只是在移除gets()的时候才开始。

    尽管它被弃用了,但现在它的语义并没有改变。


    在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中静态函数可以有静态和非静态变量…??