程序员什么时候使用'静态'和' const'关键字?

时间:2014-03-26 12:08:05

标签: static const

我正在研究static和const关键字。

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

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

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

3 个答案:

答案 0 :(得分:3)

const变量或常量将用于声明一个不会改变的值,或者你想要防止被改变的值。例如,Pi可以在C ++中声明为常量。

const double kPi = 3.14159265359;

静态变量有点不同。只有一个静态变量实例在类\ functions之间存在。

例如:

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

int main()
{
    int i;
    for(i = 0; i < 5; ++i)
    {
        foo();
    }
}

会打印:

0
1
2
3
4

即使bar超出范围,它的值仍然在内存中,因此它只被初始化一次。每次调用foo()时,该值都会递增。

编辑:

为了澄清,编译器实际上将为其生成的汇编代码中的静态变量保留内存。另外,static关键字还告诉编译器初始化变量一次。变量的范围是相同的(在foo函数内),但在上述情况下它只被初始化一次。调用函数时,自动变量(例如int i)被压入调用堆栈。

答案 1 :(得分:2)

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

嗨,在极少数情况下你可以使用const和static关键字,例如:

CONST

首先,过去常说无法修改变量。

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;
}

//此功能将打印1然后2然后3 ...

如果您有任何疑问,欢迎您:)

答案 2 :(得分:0)

如果你想让任何变量/方法可用而不管你是一个静态成员的对象,但如果你想让它同样不可修改,那么const就是解决方案。以下示例可以帮助您理解这一点。

在下面的例子中

  • PI定义为常量,不能/不应该更改
  • ONLINE保持在线用户数量,可以更改但无论对象是否可用

    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; }
    }