static的总结相比之前的const会简单不少,内容分支不是很多,希望大家可以细心看到最后,一定会有所收获的!
静态变量
函数中的静态变量
#include <iostream>
using namespace std;
int stnum = 0;
void func1()
{
static int num1 = 0;
cout << num1 << " ";
num1++;
}
int main()
{
for (int i = 0; i < 10; ++i)
{
func1();
}
cout << endl;
for (int i = 0; i < 10; ++i)
{
++stnum;
cout << stnum << " ";
}
return 0;
}
在学习C语言的时候我们就学过了static修饰变量可以将变量开辟在常量区,开辟在常量区之后的变量,首先改变的是生命周期(这个之后再说),其次这个变量在第一次被初始化之后,后期对值所做的修改变量也会改变,不会因为出函数作用域而被销毁(这也和变量生命周期被改变有关)。
在上面的代码中,大家一定要注意一个问题,stnum是在函数外创建的变量,没有static修饰但也是一个创建在常量区的变量,而static修饰的变量num1也是在常量区的一个变量,不同之处在于前者的作用域是全局,后者的作用域是func1函数内部,所以即使是static修饰的变量,虽然创建在了常量区,但是使用的时候一定注意作用域!
类中的静态变量
类中的静态变量是属于类而不属于类对象,这一定也很好理解,静态变量只能被初始化一次,但是类对象中的成员变量对于每个对象来说都是独立的,所以对于不同的对象,不能有相同静态变量 的多个副本。因为这个原因,静态变量不能使用构造函数初始化。
#include <iostream>
using namespace std;
class test
{
public:
static int _i;
test()
{}
};
int test::_i = 10;
int main()
{
test t1;
t1._i = 1;
test t2;
t2._i = 2;
cout << t1._i << " " << t2._i << endl;
return 0;
}
上面代码中,在类外定义了类中的静态变量_i,之后再main函数中对其进行修改,最终的打印结果为 2 2 ,所以就可以发现,静态变量可以通过对象进行修改,但是最后一次被修改的值为最终值。
总结一下:
- 类中的静态变量只能再类外被初始化,不能再任何函数内初始化,初始化格式如上代码所示
- 类中的静态变量可以理解为属于类的一个成员变量,之后通过对象对其进行的修改,最后一次修改的值为静态变量的最终值
静态成员
类对象为静态
这里要说的就是上面提到的生命周期,就像变量一样,对象也在声明为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()
{
Apple obj;
cout << "End of main\n";
}
输出:
Inside Constructor
Inside Destructor
End of main
在上面的代码中,obj是普通对象,来看它的构造和析构的顺序,和我们想象中一样,在执行cout之前对象就已经被回收掉了。最后打印最后一句End of main
#include<iostream>
using namespace std;
class Apple
{
int i;
public:
Apple()
{
i = 0;
cout << "Inside Constructor\n";
}
~Apple()
{
cout << "Inside Destructor\n";
}
};
int main()
{
static Apple obj;
cout << "End of main\n";
}
输出:
Inside Constructor
End of main
Inside Destructor
这份代码就很清楚的看到了,被const修饰后的obj对象,生命周期为整个程序,程序结束,static对象被回收,调用对应的析构函数。
类中的静态函数
很类中的静态变量相似,静态成员函数不属于任意一个类对象,而是属于这个类,最明显的就是类中的静态函数是没有this指针,所以静态函数是不可以访问除静态变量的其他成员变量的。
class test
{
private:
int _a;
public:
static int _i;
test(int num = 0)
:_a(num)
{}
static void Print()
{
cout << _i;
}
};
int test::_i = 10;
int main()
{
test t1(11);
t1.Print();
return 0;
}
结果是可以打印出10的,为什么不可以访问其他非静态成员变量也是可以理解的,因为其他非静态成员变量是属于对象的,没有this指针,就不知道要访问哪个对象的成员变量。
内容不多,但是还是有很多细节值得理解,谢谢大家支持,希望大家学习愉快!