【C++】static 关键字

简介: static 关键字的作用体现在以下两个方面

一. static 关键字概述

static 关键字的作用体现在以下两个方面


实现数据共享,节约内存

保持封装性,避免命名冲突

static 可以作用的对象


C语言:局部变量、全局变量、函数

C++:类的成员变量和成员函数

static 关键字的生命周期


程序开始时 或 类开始加载时就会为static修饰的变量分配空间(它们存储在数据段),进程结束时才会释放空间。


定义静态局部变量和静态全局变量创建时可以不给初值,默认初始值为0

成员函数可以定义在类内部,也可以在外部定义(在外部定义时不能加static关键字)

成员变量必须在类外部定义其值(在外部定义时不能加static关键字)

二. 修饰静态函数

使用方法:在函数返回值类型前添加 static


效果:被修饰的函数只能在当前的文件中使用,在其他文件中可以定义相同名称的函数。


解释说明


在一个项目中我们创建两个源文件:main.cpp 和 demo.cpp,如果我们在两个文件中定义了相同名称的函数的话编译就会报错:



5431104399d940a7881c4d611ed024d4.png

正确的方法是在一个文件中去定义函数,在另一个文件中去引入该函数的声明,这样两个文件中都可以使用这个函数:


56a3bda5c16a4bf1890ef4166203f9f1.png

如果我们只想让 Fun() 函数在定义它的文件内使用,而不能被外部文件使用,应该怎么做到呢?我们只需给这个函数加上 static 关键字即可,这样该函数就变为静态函数,其作用域由之前的整个项目内的文件都可访问变为了只能在本文件内被访问:


3a29b4ac396c4740b53a5ee7ebcf88f2.png

demo.cpp 中的 Fun() 函数变为静态函数之后,我们可以在 main.cpp 中声明去定义同名 Fun() 函数了,二者作用域不同,互不影响:

0c3c7a11c0da46938d6cc10b8f921ae3.png


三. 修饰全局静态变量

使用方法:在全局变量前添加 static


作用效果:把全局变量的作用域缩小为只能在本文件内访问,生命周期不变。


解释说明


1、数据位于静态区,自动初始化为0,仅用于本文件,其他文件可以定义相同名称变量。

ad1d7eb102ce4a9898a7d754b7b1557a.png



2、全局变量在外部文件采用 extern 可以访问,但全局静态变量不可访问,它的作用域缩小为仅在本文件内可以访问。

968e3bfbe9754d5fb4a2e77acd2acb00.png



四. 局部静态变量

使用方法:在局部变量前添加 static


作用效果


把局部变量的生命周期延长(生命周期和全局变量一样,随进程一起结束),但作用域不变。

局部变量(栈区)在函数执行结束后,将会被释放,但静态局部变量会一直存在,直到程序执行结束。

解释说明


1、数据位于静态区,不初始化的话默认值为0


05faf470f70d43de8e350d7c66392458.png


2、数据存储在静态区,变量只被初始化一次,之后不再初始化,数值在每次调用时根据语句功能进行修改。

e01d880885de4268b663327307d08a8a.png



五. 类的静态成员变量

使用方法:在类的成员变量前添加 static,该静态成员变量只能在类的内部定义,外部声明。


作用效果:实现多对象的数据共享,即多对象的静态成员变量只占一处内存,由该类的所有对象共用。


解释说明


1、成员变量必须在类外部定义其值(在外部定义时不能加static关键字),在访问时可以通过类名直接访问


class A
{
public:
  static int n;
};
// 类的静态成员变量只能在类外部定义(类外部定义时不能加static关键字),类内部声明
int A::n = 10;
int main()
{
  // 1、通过示例对象访问静态成员变量
  A a;
  cout << a.n << endl;// 输出10
  // 2、因为类的静态成员变量是所有该类的对象所共享的
  //    所以也可以通过类名直接访问
  cout << A::n <<endl;// 输出10
  return 0;
}


2、静态成员变量必须定义设初值,否则编译不通过


fa41c265d26d44bc94244580df7d1604.png


3、静态成员变量的访问也是受类的访问限定符得限制的


41c5fa90fe1c4960b7937c3528e1c983.png


六. 类的静态成员函数

使用方法:在类的成员函数返回值类型前加 static


作用效果:为多对象提供服务,函数内部无法访问属于类对象的非静态成员,只能访问类的静态成员。


解释说明


1、类的内部、外部都可以定义类的成员函数

96768b1d621b4b81b325a8164fd4f6dc.png



2、普通成员函数隐含this指针在第一个参数,它指向对象本身,因而可以访问对象的成员;而静态成员函数没有this指针,所以:


非静态成员函数可以任意地访问静态成员和非静态成员。

静态成员函数不能访问非静态成员,只能访问静态成员。


相关文章
|
2月前
|
存储 编译器 C语言
详解C/C++中的static和extern
本文详解了C/C++中`static`和`extern`关键字的用法和区别,通过具体代码示例说明了在不同情境下如何正确使用这两个关键字,以及`extern "C"`在C++中用于兼容C语言库的特殊作用。
详解C/C++中的static和extern
|
1月前
|
存储 编译器 C++
【C++】深入探索类和对象:初始化列表及其static成员与友元(一)
【C++】深入探索类和对象:初始化列表及其static成员与友元
|
1月前
|
C语言 C++
C 语言的关键字 static 和 C++ 的关键字 static 有什么区别
在C语言中,`static`关键字主要用于变量声明,使得该变量的作用域被限制在其被声明的函数内部,且在整个程序运行期间保留其值。而在C++中,除了继承了C的特性外,`static`还可以用于类成员,使该成员被所有类实例共享,同时在类外进行初始化。这使得C++中的`static`具有更广泛的应用场景,不仅限于控制变量的作用域和生存期。
53 10
|
1月前
|
存储 编译器 数据安全/隐私保护
【C++篇】C++类与对象深度解析(四):初始化列表、类型转换与static成员详解2
【C++篇】C++类与对象深度解析(四):初始化列表、类型转换与static成员详解
29 3
|
1月前
|
编译器 C++
【C++篇】C++类与对象深度解析(四):初始化列表、类型转换与static成员详解1
【C++篇】C++类与对象深度解析(四):初始化列表、类型转换与static成员详解
45 3
|
1月前
|
C++
【C++】深入探索类和对象:初始化列表及其static成员与友元(二)
【C++】深入探索类和对象:初始化列表及其static成员与友元
|
1月前
|
编译器 C++
【C++】深入探索类和对象:初始化列表及其static成员与友元(三)
【C++】深入探索类和对象:初始化列表及其static成员与友元
|
2月前
|
C++
C/C++静态链接pthread库的坑【-static -pthread】
C/C++静态链接pthread库的坑【-static -pthread】
|
4月前
|
存储 安全 编译器
【C++入门 四】学习C++内联函数 | auto关键字 | 基于范围的for循环(C++11) | 指针空值nullptr(C++11)
【C++入门 四】学习C++内联函数 | auto关键字 | 基于范围的for循环(C++11) | 指针空值nullptr(C++11)
|
4月前
|
存储 编译器 C++
C++从遗忘到入门问题之float、double 和 long double 之间的主要区别是什么
C++从遗忘到入门问题之float、double 和 long double 之间的主要区别是什么