Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ “究竟是什么?”;“静态”;声明时的意思是;“全球”;C+中的变量+;?_C++_Static Variables_Static - Fatal编程技术网

C++ “究竟是什么?”;“静态”;声明时的意思是;“全球”;C+中的变量+;?

C++ “究竟是什么?”;“静态”;声明时的意思是;“全球”;C+中的变量+;?,c++,static-variables,static,C++,Static Variables,Static,这是一个范围的扩展 什么是静态的,如何使用,以及在处理C++时,使用“静态”的目的是什么? 谢谢。这意味着该变量是翻译单元的本地变量(简单地说,是单个源文件),不能从外部访问。静态的使用实际上是在当前的C++标准中被禁止的,而应该使用匿名的命名空间: static int x = 0; 应该是: namespace { int x = 0; } 静态基本上意味着变量与程序的生命周期相关联,而不是与任何给定的函数或类实例相关联。你应该什么时候使用它?不要。目的何在?主要

这是一个范围的扩展

什么是静态的,如何使用,以及在处理C++时,使用“静态”的目的是什么?
谢谢。

这意味着该变量是翻译单元的本地变量(简单地说,是单个源文件),不能从外部访问。静态的使用实际上是在当前的C++标准中被禁止的,而应该使用匿名的命名空间:

static int x = 0;    
应该是:

namespace {
    int x = 0;    
}

静态基本上意味着变量与程序的生命周期相关联,而不是与任何给定的函数或类实例相关联。你应该什么时候使用它?不要。目的何在?主要是调试数据


一般来说,在C++中,如果你发现自己使用静态数据,那么你就错了。有时这是合适的,但却非常罕见。

这类内容似乎涵盖得相当充分

但换言之,C中有两种用法

  • 防止在定义全局变量的文件范围之外使用全局变量
  • 允许函数中的局部变量持久化函数的交叉调用,如中所示

    int getNextId() { 静态int id=0; 返回id++; }

  • C++继承了这两种功能,并添加了自己的两种用途

  • 静态成员变量:“共享”的变量可以访问类的所有实例,也可以不引用类的实例进行访问。Shared似乎是一个错误的词,但本质上我认为其结果是对静态成员变量的任何引用都引用了相同的内存位置
  • 静态方法:可以调用的方法,无需引用定义它的类的特定实例

  • 静态类成员是与类本身关联的数据和函数,而不是与类的对象关联的数据和函数

    在下面的示例中,类Fred有一个静态数据成员x_u和一个实例数据成员y_u。无论创建了多少Fred对象(不包括Fred对象),只有一个Fred::x_u副本,但每个Fred对象都有一个y_u副本。因此,x_u被称为与类关联,y_u被称为与类的单个对象关联。类似地,类Fred有一个静态成员函数f()和一个实例成员函数g()

    class{
    公众:
    
    在爪哇C++中,当静态被用于一个类中时,它或多或少意味着它在这个过程中所做的事情。对于变量,它意味着变量的11个实例存在于所有类和函数中,这意味着函数根本不隐式访问这个指针。 <>在C和C++中,当静态变量被用于全局变量或函数时,则意味着变量只能在当前C或C++文件中引用。换句话说,编译器不必为变量或函数生成任何重定位符号。

    当静态函数在局部函数中的变量旁边使用时,它表示变量不超出范围,但它将保留其从函数调用到函数调用的值。该变量实际上是一个只能从给定函数中访问的全局变量。

    < P> > C++ > D >代码>静态< /代码>在C++、D中有不同的含义。依附于上下文

    当声明自由函数或全局变量时,这意味着该函数在单个转换单元之外不可用:

    // test.cpp
    static int a = 1;
    static void foo() {}
    
    如果编译该翻译单元的结果与包含符号
    a
    foo
    的不同翻译单元链接,则不会违反一个定义规则,因为在该特定翻译单元中
    a
    foo
    是专用符号。未命名名称空间已不再使用这种用法

    // test2.cpp
    namespace {
       static int a = 1;
       static void foo() {}
    }
    
    在函数中声明局部变量时,这意味着变量的生存期将从函数的第一次调用一直延续到程序结束,而不仅仅是在调用期间:

    int foo() {
       static int counter = 0;
       return ++counter;
    }
    int main() {
      for ( int i = 0; i < 10; ++i ) { 
         std::cout << foo() << std::endl;
      }
    }
    
    在这种情况下,成员
    x
    是一个非静态成员属性,因此类的每个实例都有一个不同的
    x
    。在示例程序
    t.x
    other.x
    中,x
    引用不同的整数。另一方面
    y
    static
    ,因此有一个实例e> test::y在程序中。即使标准允许调用
    t.y
    other.y
    这两种用法都引用相同的变量。成员方法也是如此。如果它们是静态的,则它们是类级方法,可以在没有实例的情况下调用,而如果它们是非静态的,则应用于具体实例和<必须使用code>a.b或
    a->b
    语法


    <> >使用<代码>静态< /代码>类似于java中使用相同的关键字,而其他两个在该语言中不存在。在java中没有使用C++中的关键字的一种用法,即静态类初始化器的使用(在类级别的代码块由“代码>静态{}} /代码>”包围)。在爪哇,当类加载时,代码块将被执行,而只有一次。C++中的静态成员变量初始化必须在变量定义的初始化器中完成。

    但是“前一个问题”是关于java的。取决于你所谈论的静态用法。我最喜欢的引文之一。“这不是C++的新版本,除非它们找到了静态的新用法。"“肯尼……是的,我知道。这就是为什么我想扩大范围考虑C/C++。我用java得到答案,我想知道在处理C/C++时是否有所不同。@ JaveDPAR……我不太确定我在说的用法。你能回答一个答案吗?指定不同的用法,每一个的优点/缺点等等……尽管答案之一
    int foo() {
       static int counter = 0;
       return ++counter;
    }
    int main() {
      for ( int i = 0; i < 10; ++i ) { 
         std::cout << foo() << std::endl;
      }
    }
    
    struct test {
       int x;
       static int y;
    };
    int test::y;       // need to define it in one translation unit
    int main() {
       // test::x = 5; // !error cannot access a non-static member variable
                       // without an instance
       test::y = 5;    // ok
       test t, other;
       t.x = 10;       // ok
       t.y = 15;       // ok, the standard allows calling a static member through
                       // an instance, but this is the same as test::y
    }