2014-03-26 47 views
2

我正在研究静态和常量关键字。程序员何时使用'static'和'const'关键字?

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

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

我想知道关于程序员使用静态和常量关键字的例子。

+0

我想这个问题会更适合在[programmers.stackexchange.com](http://programmers.stackexchange.com/) – ponciste

回答

3

const的变量或常量,将用于声明不会改变的值或者你想从防止正在改变。例如,Pi可以在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(); 
    } 
} 

将打印:

0 
1 
2 
3 
4 

即使栏超出范围,它的价值仍然在内存中,所以它只能初始化一次。每次调用foo()时,该值都会递增。

编辑:

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

+0

如果你尝试覆盖const变量>? – variable

+0

GCC抱怨抛出错误,因为你基本上说你的const实际上不是一个const。 – csnate

+0

但每次你分配int bar = 0;所以为什么它没有得到解决? – EverythingEthical

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

(所有这一切都为Langage C++)

嗨,你可以使用常量和静态关键字在少数情况下,对于为例:

常量

首先,用来说变量不能被修改。

int main() 
{ 
const int toto[4] = {0, 1, 2, 3};  
return (0); 
} 

//我们不能在声明后修改toto,为什么它有用?它保持你的程序设计的状态

第二个,用来说一个方法不会修改对象状态。

class toto 
{ 
    int i; 

    public: 

    int geti() const; 

} 

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

第三个,用于说明传递给函数的参数不被函数修改。

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

静态

首先,过去常说,一个实现的功能是只知道内一个单一的文件。

static int fct() 
{ 
    return (0); 
} 

//可以调用ONY功能FCT()如果你是谁内就实现

文件,过去常说,一个参数或方法是共同的所有对象同班。

class toto 
{ 
    public : 

static int getLol(); 
}; 

//每个对象totoObj1,totoObj2 ...将调用相同的功能

第三和最后一个,过去常说,一个变量不相同功能的多个呼叫之间改变状态的地方声明

void fct() 
{ 
    static i = 0; 

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

//这个函数会打印1然后2然后3 ...

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