24.C++中const和static的作用

发布时间 2023-07-03 21:31:10作者: CodeMagicianT

static

●不考虑类的情况

○隐藏。所有不加static的全局变量和函数具有全局可见性,可以在其他文件中使用,加了之后只能在该文件所在的编译模块中使用

○默认初始化为0,包括未初始化的全局静态变量与局部静态变量,都存在全局未初始化区

○静态变量在函数内定义,始终存在,且只进行一次初始化,具有记忆性,其作用范围与局部变量相同,函数退出后仍然存在,但不能使用

静态变量在函数内定义时,会在程序运行时分配一块固定的内存空间,这块内存空间的生命周期与程序的运行周期相同,因此静态变量具有记忆性,只进行一次初始化。在函数退出后,静态变量仍然存在,但是不能使用,因为其作用域仅限于函数内部。

举个例子,比如下面这个函数:
```C语言
int func() 
{
    static int count = 0;
    count++;
    return count;
}
```
在第一次调用func()时,静态变量count会被初始化为0,并返回1。在第二次调用func()时,count的值已经被记忆为1,会自增为2,并返回2。在后续的调用中,count的值会一直累加,因为静态变量具有记忆性。但是,如果在函数外部调用count,则会编译错误,因为其作用域仅限于函数内部。

●考虑类的情况

○static成员变量:只与类关联,不与类的对象关联。定义时要分配空间,必须类内声明,类外初始化,初始化时不需要标示为static;可以被非static成员函数任意访问。

○static成员函数:不具有this指针,无法访问类对象的非static成员变量和非static成员函数;不能被声明为const、虚函数和volatile;可以被非static成员函数任意访问

const

●不考虑类的情况

○const常量在定义时必须初始化,之后无法更改

○const形参可以接收const和非const类型的实参,例如// i 可以是 int 型或者 const int 型void fun(const int& i){ //...}

●考虑类的情况

○const成员变量:不能在类定义外部初始化,只能通过构造函数初始化列表进行初始化,并且必须有构造函数;不同类对其const数据成员的值可以不同,所以不能在类中声明时初始化

○const成员函数:const对象不可以调用非const成员函数;非const对象都可以调用;不可以改变非mutable(用该关键字声明的变量可以在const成员函数中被修改)数据的值

补充一点const相关:const修饰变量是也与static有一样的隐藏作用。只能在该文件中使用,其他文件不可以引用声明使用。 因此在头文件中声明const变量是没问题的,因为即使被多个文件包含,链接性都是内部的,不会出现符号冲突。