当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《C++中静态与C++中静态之间的区别?》经验,为你挑选了4个好方法。

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



1> paxdiablo..:

static关键字在C和C++中具有相同的用途.

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

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

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

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

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

    C++ static在一个类中还有一个用途.在那里使用时,它变成一个单独的类变量,在该类的所有对象中都是通用的.一个经典示例是存储已为给定类实例化的对象数.

正如其他人所指出的那样,不推荐使用文件级静态来支持未命名的命名空间.但是,我相信在它真正从语言中移除之前,在某个温暖的地方会是一个寒冷的日子 - 目前使用它的代码太多了.虽然我们都知道这是一个危险的功能,但ISO C只是刚刚去除了gets().

而且,即使它弃用,这并没有改变它的语义现在.


虽然文件级别的静态与限制文件可见性相关的目的与未命名的命名空间相同,但存在差异.Static具有内部链接,而未命名的命名空间具有外部链接(但由于名称重整,仍然无法从外部访问)未命名的命名空间的外部链接是必要的,以允许在未命名的命名空间中声明的类型用作模板参数.

2> UncleO..:

在C++中不推荐在文件范围内使用static来限制对当前转换单元的访问,但在C语言中仍然可以接受.

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

namespace
{
    int file_scope_x;
}

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

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

最初,它意味着变量(例如在函数中)将在程序的生命周期中为这些变量提供存储,而不是像函数局部变量那样存储在堆栈中.

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

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


应该注意的是,从C++ 11开始,文件范围静态弃用已被删除,但它仍然不能用于类型.但是,将来可能会有更多变化.
值得阅读"export"关键字.导出的意外副作用是,一个转换单元中的导出模板可以引用未命名的命名空间中的对象和函数!它实际上提出了C++委员会必须在名称空间对象上重新实现静态的可能性,因为没有它,没有办法确保这些变量对其他翻译单元不可见.

3> Martin York..:

它在两种语言中具有相同的含义.

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



4> 小智..:

请注意,使用静态来表示"文件范围"(也称为命名空间作用域)只能通过C++标准对象而不是函数进行详细说明.换一种说法,:

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

引用标准的附录D:

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

推荐阅读
pan2502851807
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有