static跟const用法辨析
static跟const是日常编程实践中使用频繁的关键字,接下来,本文将从如下几个角度,分享static跟const用法特性;
链接性->初始化->函数中使用->static成员变量->const成员变量->static成员函数->const成员函数
1.链接性
全局申明的static变量或函数,将改变其默认链接属性(变成仅当前文件可见);
而const申明的全局变量也有同样的效果;
2.初始化
static变量未初始化时,默认初始化为0,且全局static变量,局部static变量都存储在.bss段
const变量必须初始化,一旦初始化后,不可更改其值;
3.函数相关使用
在函数中,可以申明static局部变量,该static局部变量一次定义后可以保持其内存空间不会随着函数调用结束而销毁,直到程序解释才会释放内存空间。如下:
void func(void){
static int count =0;
count++;
std::cout<<count<<std::endl;
}
int main(int argc,char** argv){
func();//count==1
func();//count==2
func();//count==3
return 0;
}
与此不同的是,const除了可以申明局部变量的不变属性,还可以用于修饰函数形参。表示函数不会改变传入实参的值。const修饰的形参可以接受const/非const实参,毕竟实参const或非const都不影响形参的行为(无论你喜欢还是不喜欢,我都会这样,主打一个深情)
4 .static成员变量
static类中定义的属于类而被所有类对象的对象共享的变量(需要在类外初始化);
static成员变量既可以被static成员函数也可以被非static成员函数访问;
5 .const成员变量
仅能在类的构造函数初始化列表中进行初始化,因为类的构造函数体开始执行,就意味着已经完成了对象构造,而const变量一旦构造就不可更改;
6 .static成员函数
static成员函数最大的特点就是无this指针,即它也是专属与类而不是类的对象的概念;
无this指针也就注定了static成员函数不能访问类的对象的成员变量与成员函数;
但是static成员函数可以被static/非staic成员函数访问;
7 .const成员函数
跟static不同,const成员函数的含义是不会改变类的对象的状态,因此无论是const对象还是非const对象,都可以调用const成员函数;
同样const成员函数可以被const/非const成员函数访问(但要保证不改变对象状态)