static、const关键词作用

在c语言中,static关键词根据出现位置不同,其作用也不完全相同。

在函数中使用时,用于声明一个静态局部变量。静态变量并不随着其所在函数的调用结束被一起销毁,而是保留到下一次调用时继续使用。注意,static修饰的局部变量仍然是一个局部变量,它的作用域仍然还是这个函数内。其默认值为0。

在代码块外,用在一个全局变量或是函数前时,它会改变默认的external属性,使得这个变量或函数有效范围限制在当前文件内;换句话说其他文件不可使用当前变量或函数,哪怕声明了extern也不行。

static int a;
int b;   //a和b都是全局变量,但a不可以被其他文件调用

void func()
{
      static   int c;   //c只初始化一次。默认为0
      int d;    //d每次都要初始化
}

 未初始化的全局变量和静态变量储存在bss段,经过初始化的全局和静态变量则储存在data段。在data/bss段储存数据,称为静态内存分配。编译时已经分配好了内存。

--------------------------------------------

const在c语言中主要是将变量变成常量,修饰函数和返回值;在c++中,还能修饰函数定义,定义类的成员函数。被const修饰的变量,其值一般不可更新。

此外,const修饰后,变量默认失去external属性。

总的来说,const代表的就是“只读”属性。按照规则,在多个关键词连续时,const最近的关键词即不能修改项。

1.const修饰一个变量时,只能在初始化时修改值,否则之后就不能再修改

2.const与指针连用时:

const int *p;  //const修饰int,*p还是*p,它指向的值不能变
int const *p;  //const还是修饰int

int *const p  //const修饰int *,即*p这个指针本身不可改变

const int* const p // *p和它指向的值都无法改变

3.程序中有时候会意外给不该重新赋值的变量赋值,加入const也可以起到保护作用。

 

4. 在c++中,const还可能与引用相结合。引用的实现和指针其实类似,作用是给原变量起一个别名,但是在使用时会自动解引用,不用像指针变量一样要加个*标记。

在引用后,名称无法再次改变,并且引用时会开辟一个新空间储存被引用变量的地址。

引用的效果:
int a=10;
int &b=a;  //此处即引用,b和a指向同一变量。改a改b效果一样
注意,这里的&表引用。

与const结合时:

const int a=10;
如果试图int &b=a;会直接报错


但是,
const int &b=a;//是正确的  常量就对应常引用

//一个变量能对应常引用

此外,const int &c=10;//正确,系统会临时分配一个变量

5.const在函数中。

1)无论是指针传递还是值传递,const都不能与输出参数相结合,否则参数就会失效。

2)修饰输入参数时,如果输入参数是一个指针,那么const可以防止意外改动指针。如果传进来的是值参数,那加不加const都一样,因为此时使用的是一个临时变量,原变量不会被改变。

但如果是一个引用传递,那加上const是有用的。如void func (const int&a)

3)const在修饰函数返回值时。如果返回的是一个指针,用const修饰以后,对应承接的变量也必须是同类型的const指针

const char* func(void)
{
}


int main()
{
     char* str=func();//错误,str必须是一个char型的const指针
     const char* str2=func();//正确      
}

4)如果返回值是一个值,那么加不加const都一样,因为函数的返回值会被复制给另一存储单元,加不加const都一样。

 

6.const修饰成员函数时。任何不修改成员数据的成员函数,都应该被声明为const类型。写在函数形参的末尾

class stack
{
     public:
     void Push(int elem);
      int func()const ;

}

在增加了const修饰后,func()这个成员函数,既不可以调用其他非const成员函数,也不可以修改数据成员(哪怕是带有const)。 const对象只能访问其他const对象,但非const对象可以访问const对象。

7.const常量一般被分配在符号表而不是内存空间中。

posted @ 2022-03-26 00:56  namezhyp  阅读(31)  评论(0编辑  收藏  举报