0
点赞
收藏
分享

微信扫一扫

C++中static关键字的作用总结

static的含义

static的含义解释为静止的,静态的,当然它在编程语言中也是相关的含义,接下来,让我们看看在C++语言中,static关键字修饰不同的类型时,它的具体含义是什么。

static修饰不同数据类型时的含义

核心要点:static 作用-控制变量的存储方式和可见性。

static修饰局部变量

一般情况下,对于局部变量在程序中是存放在栈区的,并且局部的生命周期在语句块执行结束后结束。但是如果用 static 关键字修饰的话,该变量便会存放在静态数据区,其生命周期会⼀直延续到整个程序执行结束。但是要注意的是,虽然用static 对局部变量进行修饰之后,其生命周期以及存储空间发生了变化,但其作用域并没有改变,作用域还是限制在其语句块。 例子:

int main(){
static int a = 0;
std::cout << a <<std::endl;
{
static int b = 1;
std::cout << b << std::endl;
}
std::cout << b << std::endl;//操作是异常的,虽然b的生命周期直到整个程序结束,但作用域还是上面的空间return 0;
}

static修饰全局变量

对于⼀个全局变量,它既可以在本文件中被访问到,也可以在同⼀个工程中其它源文件被访问(添加 extern进行声明即可)。用 static 对全局变量进行修饰改变了其作用域范围,由原来的整个工程可见变成了本文件可见

static修饰函数

用 static 修饰函数,情况和修饰全局变量类似,也是改变了函数的作用域,仅本源文件可见,这样我们可以利用这个特点,在不同的源文件中定义相同名字的函数,但是不推荐这样做,逻辑不清晰,容易出现异常。

static修饰类成员变量

如果对类中的某个变量进行 static 修饰,则表示该变量以及所有的对象所有,存储空间中只存在一个副本,可以通过类和对象去调用。

静态非常量数据成员,其只能在类外定义和初始化,在类内仅是声明而已。 static 类对象必须要在类外进行初始化,static 修饰的变量先于对象存在,所以 static 修 饰的变量要在类外初始化;

在模块内的 static 全局变量可以被模块内所有函数访问,但不能被模块外其它函数访问;

static修饰类成员函数

如果 C++ 中对类中的某个函数用 static 修饰,则表示该函数属于一个类而 不是属于此类的任何特定对象;

  • 在模块内的 static 函数只可被这⼀模块内的其它函数调用,这个函数的使用范围被限制在声明它的模块内;
  • 在类中的 static 成员函数属于整个类所拥有,这个函数不接收 this 指针,因而只能访问类的 static 成员变量
  • 由于 static 修饰的类成员属于类,不属于对象,因此 static 类成员函数是没有 this 指针, this 指针是指向本对象的指针,正因为没有 this 指针,所以 static 类成员函数不能访问⾮ static 的类成员,只能访问 static修饰的类成员;
  • static 成员函数不能被 virtual 修饰,static 成员不属于任何对象或实例,所以加上 virtual 没有任何实际意义;因为虚函数的实现是为每⼀个对象分配⼀个vptr 指针,而vptr 是通过 this 指针调用的,所以不能为 virtual;虚函数的调用关系,this->vptr->ctable->virtual function
举报

相关推荐

0 条评论