静态关键字和不同类型一起使用时具有不同的含义
静态变量
单独的静态变量
当一个变量被声明为静态时,它的空间会在程序的生命周期内分配。即使多次调用该函数,静态变量的空间也只分配一次,并且上一次调用中的变量值会通过下一次函数调用进行。
这对于在 C/C++或任何其他需要存储函数先前状态的应用程序中实现协程很有用。
类中的静态变量
由于声明为静态的变量只初始化一次,因为它们在单独的静态存储中分配了空间,因此类中的静态变量由对象共享。在类之外主函数中可以声明同名变量,因为原来的变量是在类中的。
对于不同的对象,不能有多个相同静态变量的副本。也因为这个原因静态变量不能使用构造函数初始化。
#include<iostream>
using namespace std;
class test_class_static{
public :
static int i;
GfG(){};
}
int test_class_static::i=5;//初始化格式
int main(){
GfG obj1;
GfG obj2;
cout<<obj.i<<' '<<obj.i<<"\n";
}
//输出为
5 5
1.静态数据成员不能在类定义中初始化,也不能在main函数里面初始化,一般在类外和main()函数之前初始化。
2.static成员的所有者是类本身,但是多个对象拥有一样的静态成员。从而在定义对象是不能通过构造函数对其进行初始化。
3.静态变量仍然遵循public,private,protected访问准则。
类对象作为静态
class GfG
{
int i = 0;
public:
GfG()
{
i = 0;
cout << "Inside Constructor\n";
}
~GfG()
{
cout << "Inside Destructor\n";
}
};
int main()
{
int x = 0;
if (x==0)
{
static GfG obj;
}
cout << "End of main\n";
}
输出为
Inside Constructor
End of main
Inside Destructor
main 结束后调用析构函数。发生这种情况是因为静态对象的范围贯穿程序的整个生命周期。
类的静态成员函数
就像类内部的静态数据成员或静态变量一样,静态成员函数也不依赖于类的对象。
我们可以使用对象和“.”来调用静态成员函数。运算符,但建议使用类名和作用域解析运算符调用静态成员。
静态成员函数只能访问静态数据成员或其他静态成员函数,不能访问类的非静态数据成员或成员函数
class GfG
{
public:
// static member function
static void printMsg()
{
cout<<"Welcome to GfG!";
}
};
// main function
int main()
{
// invoking a static member function
GfG::printMsg();
}