【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指针,所以:


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

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


相关文章
|
存储 编译器 C语言
详解C/C++中的static和extern
本文详解了C/C++中`static`和`extern`关键字的用法和区别,通过具体代码示例说明了在不同情境下如何正确使用这两个关键字,以及`extern "C"`在C++中用于兼容C语言库的特殊作用。
472 4
详解C/C++中的static和extern
|
5月前
|
存储 编译器 程序员
c++的类(附含explicit关键字,友元,内部类)
本文介绍了C++中类的核心概念与用法,涵盖封装、继承、多态三大特性。重点讲解了类的定义(`class`与`struct`)、访问限定符(`private`、`public`、`protected`)、类的作用域及成员函数的声明与定义分离。同时深入探讨了类的大小计算、`this`指针、默认成员函数(构造函数、析构函数、拷贝构造、赋值重载)以及运算符重载等内容。 文章还详细分析了`explicit`关键字的作用、静态成员(变量与函数)、友元(友元函数与友元类)的概念及其使用场景,并简要介绍了内部类的特性。
253 0
|
存储 编译器 C++
【C++】深入探索类和对象:初始化列表及其static成员与友元(一)
【C++】深入探索类和对象:初始化列表及其static成员与友元
267 2
|
9月前
|
安全 编译器 程序员
C++ noexcept 关键字的关键作用
`noexcept` 关键字在 C++ 中扮演着重要角色,通过正确使用 `noexcept`,可以提升程序的性能、增强代码的可读性和安全性,并且有助于编译器进行优化。在编写 C++ 代码时,应仔细考虑每个函数是否应该声明为 `noexcept`,以充分利用这一特性带来的优势。通过本文的介绍,希望开发者能够更好地理解和应用 `noexcept` 关键字,从而编写出更加高效、健壮的 C++ 程序。
316 8
|
11月前
|
安全 编译器 C++
C++ `noexcept` 关键字的深入解析
`noexcept` 关键字在 C++ 中用于指示函数不会抛出异常,有助于编译器优化和提高程序的可靠性。它可以减少代码大小、提高执行效率,并增强程序的稳定性和可预测性。`noexcept` 还可以影响函数重载和模板特化的决策。使用时需谨慎,确保函数确实不会抛出异常,否则可能导致程序崩溃。通过合理使用 `noexcept`,开发者可以编写出更高效、更可靠的 C++ 代码。
|
存储 编译器 C++
【c++】类和对象(下)(取地址运算符重载、深究构造函数、类型转换、static修饰成员、友元、内部类、匿名对象)
本文介绍了C++中类和对象的高级特性,包括取地址运算符重载、构造函数的初始化列表、类型转换、static修饰成员、友元、内部类及匿名对象等内容。文章详细解释了每个概念的使用方法和注意事项,帮助读者深入了解C++面向对象编程的核心机制。
311 5
|
C语言 C++
C 语言的关键字 static 和 C++ 的关键字 static 有什么区别
在C语言中,`static`关键字主要用于变量声明,使得该变量的作用域被限制在其被声明的函数内部,且在整个程序运行期间保留其值。而在C++中,除了继承了C的特性外,`static`还可以用于类成员,使该成员被所有类实例共享,同时在类外进行初始化。这使得C++中的`static`具有更广泛的应用场景,不仅限于控制变量的作用域和生存期。
306 10
|
存储 编译器 数据安全/隐私保护
【C++篇】C++类与对象深度解析(四):初始化列表、类型转换与static成员详解2
【C++篇】C++类与对象深度解析(四):初始化列表、类型转换与static成员详解
180 3
|
编译器 C++
【C++篇】C++类与对象深度解析(四):初始化列表、类型转换与static成员详解1
【C++篇】C++类与对象深度解析(四):初始化列表、类型转换与static成员详解
281 3
【C++】深入探索类和对象:初始化列表及其static成员与友元(二)
【C++】深入探索类和对象:初始化列表及其static成员与友元
112 3

热门文章

最新文章