「前言」所有文章已经分类好,放心食用
「归属专栏」C语言 | C嘎嘎
「主页链接」个人主页
「笔者」枫叶先生(fy)
static 的用法和作用???
static作用:
- 作用1修改存储方式:用 static 修饰的变量存储在静态区(数据段,静态区在 C++ 里喜欢叫数据段)
- 作用2可见性:当编译多个文件使,所有未加 static 修饰的全局变量和函数,都具有全局可见性,但是使用了 static 修饰之后,修饰的全局变量和函数都只在当前文件可见
- 作用3初始化:被static修饰的变量默认初始化为0(内置类型)
作用1补充:
用static修饰的变量,在程序开始运行时就已经初始化完成了,在 main 函数之前,并且只初始化一次
测试作用2:
// A.h
#include <iostream>
using namespace std;
static int a = 1;
static void func1() { cout << "A.h" << endl; }
// B.cpp
#include "A.h"
static int b = 2;
static void func2() { cout << "B.cpp" << endl; }
// C.cpp
#include "A.h"
static int c = 3;
static void func3() { cout << "C.cpp" << endl; }
int main()
{
cout << a << endl; // true
cout << b << endl; // 编译错误,b未定义
cout << c << endl; // true
func1(); // 编译错误,func1未定义
func2(); // true
func3(); // true
return 0;
}
编译:
测试作用1:
#include <iostream>
using namespace std;
static int a;
int b;
int main()
{
static int c;
cout << a << endl;
cout << b << endl;
cout << c << endl;
return 0;
}
编译运行
注:全局变量也具备这个属性(默认初始化为0,对于内置类型),因为全局变量也存储在静态区(数据段)
static 用法:
- 用法1:修饰局部变量。生命周期随进程,但是作用域没有发生改变,作用域还是限制在该变量所处的作用域
- 用法2:修饰全局变量。生命周期随进程,修改了作用域,由全工程可见变成本文件可见
- 用法3:修饰函数。与修饰全局变量相似,改变了作用域
- 用法4:修饰类成员变量。生命周期随进程,该变量属于整个类,只有一份,属于所有对象所有;static 修饰的类成员变量只能在类外初始化,类内定义类外初始化
- 用法5:修饰类成员函数。该函数属于整个类,不属于特定的对象,通过类对象调用,并且没有
this
指针,只能访问类内 static 修饰的变量 - 用法6:
static const
修饰变量。同用法1,2;但是所修饰的变量的值不能被改变 - 用法7:
static const
修饰类成员变量。生命周期随进程,该变量属于整个类,只有一份,属于所有对象所有;所修饰的变量的值不能被改变。但是类内可以初始化内置类型,其他类型需要类外初始化
一些用法在该文章测试,文章:链接
注意:static 修饰的类成员函数不能被virtual
修饰,因为 static 修饰的类成员函数没有this
指针
用法4测试
静态成员变量必须在类外定义,定义时不添加 static 关键字,类中只是声明
class A
{
private:
static int _a;//声明
};
int A::_a = 0;//静态成员定义
int main()
{
A aa;
return 0;
}
// 运行 true
错误用法测试:
class A
{
private:
static int _a = 1; // erroe
};
int main()
{
A aa;
return 0;
}
// 编译 false
编译报错:
用法7测试
类内可以初始化内置类型
class A
{
private:
static const int _a = 1;
};
int main()
{
A aa;
return 0;
}
// 运行 true
其他类型需要类外初始化:
class A
{
private:
static const string str = "aaa";
};
int main()
{
A aa;
return 0;
}
// 编译 false
正确用法:
class A
{
private:
static const string str;
};
int main()
{
A aa;
return 0;
}
// 初始化:const 变量类型 类名::变量名
const string A::str = "aaa";
// 运行 true
「 作者 」 枫叶先生
「 更新 」 2024.3.3
「 声明 」 余之才疏学浅,故所撰文疏漏难免,
或有谬误或不准确之处,敬请读者批评指正。