前言
这里简单记录一下C++中static关键相关内容,记录于此,方便自己查阅。
正文
作用
关键字static
主要用于改变变量或函数的存储方式,从而改变其作用域和生命周期。
初始化
初始化只有一次,但是可以多次赋值。
在主程序之前,编译器已经为其分配好了内存。静态局部变量和全局变量一样,数据都存放在全局区域,所以在主程序之前,编译器已经为其分配好了内存,但在C语言和C++中静态局部变量的初始化节点又有点不太一样。
C语言:编译阶段就分配好内存并初始化。
C++:首次使用静态变量时才会进行初始化。
使用场景
修饰局部变量
当
static
修饰函数内部的局部变量时,把变量的生命周期会延长至整个程序运行期间,但其作用域仍然局限于该函数内部。void test() { static int age_static; std::cout << age_static << std::endl; } int main() { //std::cout << age_static << std::endl; //提示未定义 test(); }
修饰全局变量
当
static
修饰全局变量时,该变量的作用域会被限制在定义它的文件内部,其他文件时不可见的,也无法访问!//two.cpp static int age = 101; //错误,无法链接,只能在two.cpp中可见。 int age = 101; //正确,one.cpp中可以通过extern 访问。
//one.cpp #include <iostream> int main() { extern int age; std::cout << age << std::endl; }
上面int age不使用static修饰就OK,使用了static修饰就无法编译成功。
修饰函数
static
修饰的函数即被称为静态函数。静态函数与普通函数不同,它只能在声明它的文件当中可见,不能被其它文件使用。案例一和案例二是不同的写法!
案例一
two.cpp
//two.cpp #include <iostream> //使用static修饰就无法正常编译,提示无法解析 //static void forTest() { // std::cout << "forTest" << std::endl; //} void forTest() { std::cout << "forTest" << std::endl; }
one.cpp
//one.cpp #include <iostream> void forTest();//声明未定义 int main() { forTest(); }
案例二
Hello.h
//Hello.h #pragma once void sendHello();
Hello.cpp
//Hello.cpp #include "Hello.h" #include <iostream> void sendHello() { std::cout << "Hello world ^_^" << std::endl; }
One.cpp
#include "Hello.h" #include <iostream> int main() { sendHello(); }
修饰类成员
静态成员变量
当
static
修饰类的成员变量时,该成员不仅属于类对象,也属于类,并且共享同一个静态数据成员。静态成员函数
和上面一样,不仅属于类对象,也属于类。静态成员函数只能访问类的静态数据成员和其他静态成员函数,不能访问非静态成员。
C++ 独有类
非静态成员函数可以任意地访问静态成员函数和静态数据成员
后面会单独介绍,略。
生命周期
静态局部变量:作用域在函数内部,生命周期在整个程序运行期间。
静态全局变量:作用域在定义它的文件内部,生命周期在整个程序运行期间。
静态类成员:作用域在整个类内部,生命周期在整个程序运行期间(对于静态数据成员而言)。
优缺点
优点
静态局部变量可以在函数调用之间保持值,避免重复初始化。
静态全局变量和函数可以实现文件隔离,避免命名冲突。
静态类成员可以实现所有对象共享的数据或函数。
缺点
静态成员函数不能访问类的非静态成员,因为它们属于类本身而非某个具体对象。
静态全局变量和函数可能会增加程序之间的耦合度,因为它们只能在定义它们的文件中访问和修改。
参考文章
《C++从入门到精通(第6版)》
《》
《