Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.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
Static 程序员何时使用';静态';和';常数';关键词?_Static_Constants - Fatal编程技术网

Static 程序员何时使用';静态';和';常数';关键词?

Static 程序员何时使用';静态';和';常数';关键词?,static,constants,Static,Constants,我正在研究静态和常量关键字 静态:使用静态修饰符声明静态成员,该成员属于类型本身而不是特定对象 const:使用const关键字来声明常量字段或常量本地字段。此关键字指定字段或局部变量的值为常量,这意味着它不能修改 我想知道程序员何时会使用static和const关键字的示例。如果您希望任何变量/方法都可用,而不管对象是什么,您都可以使用静态成员,但如果您希望该变量/方法也不可修改,那么const就是解决方案。下面的例子可以帮助您理解这一点 在下面的例子中 PI定义为常数,不能/不应更改 联机

我正在研究静态和常量关键字

静态:使用静态修饰符声明静态成员,该成员属于类型本身而不是特定对象

const:使用const关键字来声明常量字段或常量本地字段。此关键字指定字段或局部变量的值为常量,这意味着它不能修改


我想知道程序员何时会使用static和const关键字的示例。

如果您希望任何变量/方法都可用,而不管对象是什么,您都可以使用静态成员,但如果您希望该变量/方法也不可修改,那么const就是解决方案。下面的例子可以帮助您理解这一点

在下面的例子中

  • PI定义为常数,不能/不应更改
  • 联机保存联机用户的数量,它可以更改,但无论对象如何,都应该可用

    public class Example
    
    {
    
        //PI should not be changed, with reasons known that it is a constant
        public const double PI = 3.14;
    
        //Users currently using the application
        public static int ONLINE = 0;
    
        public Example(){ ONLINE++; }
        public void dispose(){ ONLINE--; }
    
        public static int loggedInUsers(){ return ONLINE; }
        public void GetArea(int radius){return PI*radius*radius; }
    }
    

常量变量或常量将用于声明一个不会更改的值或您希望防止更改的值。例如,皮可以在C++中被声明为常量。
const double kPi = 3.14159265359;
静态变量有点不同。静态变量只有一个实例在类\函数之间持续存在

例如:

void foo()
{
    static int bar = 0;
    printf("%d\n", bar);
    ++bar;
}

int main()
{
    int i;
    for(i = 0; i < 5; ++i)
    {
        foo();
    }
}
即使bar超出范围,它的值仍在内存中,所以它只初始化一次。每次调用foo()时,该值都会递增

编辑:

为了澄清这一点,编译器实际上会在其生成的汇编代码中为静态变量保留内存。此外,static关键字还告诉编译器只初始化变量一次。变量的作用域是相同的(在foo函数中),但在上述情况下只初始化一次。调用函数时,自动变量(如int i)被推送到调用堆栈上。

(所有这些都是针对Langage C++)

您好,您可以在少数情况下使用常量和静态关键字,例如:

常数

首先,用于表示变量不能修改

int main()
{
 const int toto[4] = {0, 1, 2, 3};    
 return (0);
}
//我们不能在声明后修改toto,为什么它有用?它保持程序设计的状态

,用于表示方法不修改对象状态

class toto
{
  int i;

  public:

  int    geti() const;

}
//CPP中的所有getter都使用它。为什么它有用?使用该类的开发人员知道他不会修改对象状态

第三个,用于表示传递给函数的参数不是由函数修改的

int function(const std::string &str)
{
 // function cannot modify the object string pass in parameter
}
静态

首先,用于表示实现的函数仅包含在单个文件中

static int fct()
{
  return (0);
}
//如果您是实现该函数的文件的内部成员,则可以只调用函数fct()

第二个,用于表示一个参数或方法对于同一类的所有对象都是公共的

class toto
{
  public :

 static int getLol();
};
//每个对象totoObj1,totoObj2。。。将调用相同的函数

第三个也是最后一个,用于表示变量在声明它的同一函数的多次调用之间不改变状态

void fct()
{
  static i = 0;

  std::cout << ++i << std::endl;
}
void fct()
{
静态i=0;

std::我想这个问题是否更适合于尝试覆盖const variable>?GCC抱怨抛出一个错误,因为本质上你是说你的const实际上不是一个const。但是每次你赋值int bar=0,为什么它没有得到reset?不,你不是每次调用foo()都赋值。当您使用静态变量时,您告诉编译器只初始化变量一次。如果您在上面的示例中查看编译器生成的程序集,您将发现程序集输出中实际存在一个空间,用于保存静态变量。自动变量(如上面示例中的int i)在运行时被推送到函数调用的堆栈上。但是您正在指定int bar=0。您不仅在初始化,而且还在赋值。就像bar一样++
void fct()
{
  static i = 0;

  std::cout << ++i << std::endl;
}