先决条件:C语言中的静态变量
当与不同类型一起使用时,静态关键字具有不同的含义。我们可以将static关键字用于:
静态变量:函数中的变量,类中的变量
类的静态成员:类中的类对象和函数
现在让我们详细了解一下static的每种用法:
静态变量
- 函数的静态变量:将变量声明为静态变量时,将在程序生命周期内为其分配空间。即使多次调用该函数,静态变量的空间也只会分配一次,并且上一次调用中的变量值将通过下一个函数调用进行传送。这对于在C / C++或需要存储以前函数状态的任何其他应用程序中实现协程很有用。
// C++ program to demonstrate // the use of static Static // variables in a Function #include
#include using namespace std; void demo() { // static variable static int count = 0; cout << count << " "; // value is updated and // will be carried to next // function calls count++; } int main() { for (int i=0; i<5; i++) demo(); return 0; } 输出:
0 1 2 3 4
您可以在上面的程序中看到变量计数被声明为静态。因此,它的值是通过函数调用来携带的。每次调用该函数时,变量计数都不会初始化。
附带说明一下, Java不允许在函数中使用静态局部变量。 - 类中的静态变量:由于声明为static的变量仅在它们在单独的静态存储中分配空间时才初始化一次,因此,类中的静态变量由对象共享。不同对象不能有相同静态变量的多个副本。同样由于这个原因,不能使用构造函数来初始化静态变量。
// C++ program to demonstrate static // variables inside a class #include
using namespace std; class GfG { public: static int i; GfG() { // Do nothing }; }; int main() { GfG obj1; GfG obj2; obj1.i =2; obj2.i = 3; // prints value of i cout << obj1.i<<" "< 您可以在上面的程序中看到我们尝试为多个对象创建静态变量i的多个副本。但这没有发生。因此,类内的静态变量应由用户使用类外的类名和作用域解析运算符来显式初始化,如下所示:
// C++ program to demonstrate static // variables inside a class #include
using namespace std; class GfG { public: static int i; GfG() { // Do nothing }; }; int GfG::i = 1; int main() { GfG obj; // prints value of i cout << obj.i; } 输出:
1
班级的静态成员
- 类对象为静态对象:与变量一样,当声明为静态对象时,对象的作用域也要到程序生命周期。
考虑下面的程序,其中对象是非静态的。// CPP program to illustrate // when not using static keyword #include
using namespace std; class GfG { int i; public: GfG() { i = 0; cout << "Inside Constructor\n"; } ~GfG() { cout << "Inside Destructor\n"; } }; int main() { int x = 0; if (x==0) { GfG obj; } cout << "End of main\n"; } 输出:
Inside Constructor Inside Destructor End of main
在上面的程序中,对象在if块中声明为非静态的。因此,变量的作用域仅在if块内。因此,在创建对象时,将调用构造函数,并且一旦对象的作用域仅在声明了if块的内部,则调用if块对析构函数的控制。
现在,如果我们将对象声明为静态,则让我们看到输出的变化。// CPP program to illustrate // class objects as static #include
using namespace std; 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结束之后被调用。发生这种情况是因为静态对象的范围是整个程序的生命周期。
- 类中的静态函数:就像类中的静态数据成员或静态变量一样,静态成员函数也不依赖于类的对象。允许我们使用对象和’。’调用静态成员函数。运算符,但建议使用类名和范围解析运算符调用静态成员。
静态成员函数只允许访问静态数据成员或其他静态成员函数,而不能访问类的非静态数据成员或成员函数。// C++ program to demonstrate static // member function in a class #include
using namespace std; class GfG { public: // static member function static void printMsg() { cout<<"Welcome to GfG!"; } }; // main function int main() { // invoking a static member function GfG::printMsg(); } 输出:
Welcome to GfG!
相关文章:
- 静态关键字测验
- C++中的静态数据成员
- 静态物体什么时候被破坏?
- 有关静态成员函数的有趣事实
- 静态函数可以是虚拟的吗?
- C++和Java中static关键字的比较
- C中的静态函数
要从最佳影片策划和实践问题去学习,检查了C++基础课程为基础,以先进的C++和C++ STL课程基础加上STL。要完成从学习语言到DS Algo等的更多准备工作,请参阅“完整面试准备课程” 。