1.static 全局静态变量:
2.static 局部静态变量:
局部静态变量只能被初始化一次。与全局静态变量不同的是静态局部变量的作用域仅限于函数内部,它的作用域与函数内部的局部变量相同。实际上局部静态变量同样也存储在静态存储区,因此它的生命周期贯穿于整个程序运行期间。
C++
#include <iostream>
using namespace std;
int g_var = 0; // 全局变量
static char *gs_var; // 静态全局变量
int main()
{
int var; // 局部变量
static int s_var = 0; // 静态局部变量
return 0;
}
b.cpp
C++
#include <iostream>
using namespace std;
extern int g_var = 0; // 访问全局变量
// extern static char *gs_var; 无法访问静态全局变量
int test()
{
g_var = 1;
}
3.static 静态函数:
static 函数限制函数的作用域,仅可在定义该函数的文件内部调用,如下所示程序示例编译会报错,找不到 test 函数定义。
C++
#include <iostream>
using namespace std;
int g_var = 0; // 全局变量
static char *gs_var; // 静态全局变量
extern int test();
int main()
{
int var; // 局部变量
static int s_var = 0; // 静态局部变量
test();
return 0;
}
b.cpp
C++
#include <iostream>
using namespace std;
static int test()
{
return 0;
}
4.static 静态成员变量:
C++
// C++ program to demonstrate static
// variables inside a class
#include<iostream>
using namespace std;
class GfG
{
public:
static int i;
GfG() {
};
};
int GfG::i = 1; // initial
int main()
{
GfG obj1;
GfG obj2;
obj1.i =2; // error
obj2.i = 3; // error
GfG::i = 10; // assignment
// prints value of i
cout << obj1.i<<" "<<obj2.i; // 10
}
静态成员变量可以作为成员函数的参数,而普通成员变量不可以。
C++
#include <iostream>
using namespace std;
class A
{
public:
static int s_var;
int var;
void fun1(int i = s_var); // 正确,静态成员变量可以作为成员函数的参数
void fun2(int i = var); // error: invalid use of non-static data member 'A::var'
};
int main()
{
return 0;
}
静态数据成员的类型可以是所属类的类型,而普通数据成员的类型只能是该类类型的指针或引用。
C++
#include <iostream>
using namespace std;
class A
{
public:
static A s_var; // 正确,静态数据成员
A var; // error: field 'var' has incomplete type 'A'
A *p; // 正确,指针
A &var1; // 正确,引用
};
int main()
{
return 0;
}
5.static 静态成员函数:
静态成员函数不能调用非静态成员变量或者非静态成员函数,因为静态成员函数没有 this 指针。静态成员函数做为类作用域的全局函数。
静态成员函数不能声明成虚函数(virtual)、const 函数和 volatile 函数。
C++
#include<iostream>
using namespace std;
class GfG
{
public:
static void printMsg()
{
cout<<"Welcome to GfG!";
}
};
int main()
{
GfG::printMsg();
}
6.static 对象:
静态对象的生存周期为整个程序的生命周期,而非静态对象的生命周期只存在于某个循环中,我们可以通过以下程序做对比:
C++
#include<iostream>
using namespace std;
class GfG1
{
int i;
public:
GfG1()
{
i = 0;
cout << "GFG1 Inside Constructor\n";
}
~GfG1()
{
cout << "GFG1 Inside Destructor\n";
}
};
class GfG2
{
int i;
public:
GfG2()
{
i = 0;
cout << "GfG2 Inside Constructor\n";
}
~GfG2()
{
cout << "GfG2 Inside Destructor\n";
}
};
int main()
{
int x = 0;
if (x==0)
{
GfG1 obj1;
static GfG2 obj2;
}
cout << "End of main\n";
}
程序的输出为:
C++
GFG1 Inside Constructor
GfG2 Inside Constructor
GFG1 Inside Destructor
End of main
GfG2 Inside Destructor
阅读量:2015
点赞量:0
收藏量:0