本文章为个人笔记,学习资料来源为:光城的实验室《C++那些事》,如有侵权请私信我~
其它引用:C/C++ static关键字详解
静态变量: 函数中的变量,类中的变量,全局变量
静态类的成员: 类对象和类中的函数
静态变量
1、 静态局部变量
当变量声明为 static 时,空间将在程序的生命周期内分配。即使多次调用该函数,静态变量的空间也只分配(初始化)一次,前一次调用中的变量值通过下一次函数调用传递
普通的局部变量放在栈区,这种局部变量进入作用域创建,出作用域释放;
局部变量被 static 修饰后成为静态局部变量,这种变量放在静态区,创建好后,直到程序结束后才释放。
#include <iostream>
#include <string>
using namespace std;
void demo()
{
// static variable
static int count = 0;
cout << count << " ";
count++;
}
int main()
{
for (int i=0; i<5; i++)
demo();
return 0;
}
// 输出:
// 0 1 2 3 4
2、静态成员变量
类中的静态变量由对象共享,对于不同的对象,不能有相同静态变量的多个副本。
也是因为这个原因,静态变量不能使用构造函数初始化。
类中的静态变量应由用户使用类外的类名和范围解析运算符显式初始化
#include<iostream>
using namespace std;
class Apple
{
public:
static int i;
Apple()
{
// Do nothing
};
};
int Apple::i = 1;
int main()
{
Apple obj;
// prints value of i
cout << obj.i;
}
// 输出:
// 1
3、静态全局变量和函数
static 可以修饰函数和全局变量,将其对其他源文件隐藏起来,从而避免命名冲突。对于函数来讲,static 的作用仅限于该隐藏功能。
静态成员
静态类对象
就像静态局部变量一样,对象也在声明为 static 时具有范围,直到程序的生命周期。
#include<iostream>
using namespace std;
class Apple
{
int i;
public:
Apple()
{
i = 0;
cout << "Inside Constructor\n";
}
~Apple()
{
cout << "Inside Destructor\n";
}
};
int main()
{
int x = 0;
if (x==0)
{
static Apple obj;
}
cout << "End of main\n";
}
// 输出:
// Inside Constructor
// End of main
// Inside Destructor
静态成员函数
(1)静态成员函数也不依赖于类的对象。
我们被允许使用对象和 '.' 来调用静态成员函数。但建议使用类名和范围解析运算符调用静态成员。
(2)允许静态成员函数仅访问静态成员变量或其他静态成员函数,它们无法访问类的非静态成员变量或成员函数。
#include<iostream>
using namespace std;
class Apple
{
public:
// static member function
static void printMsg()
{
cout<<"Welcome to Apple!";
}
};
// main function
int main()
{
// invoking a static member function
Apple::printMsg();
}
// 输出:
// Welcome to Apple!