- 论坛徽章:
- 0
|
解析static!
从上面的例子可以看出静态的x对象既可以使用带参数的构造函数进行初始化,象x1,也可以使用缺省的构造函数,象x2。程序控制第一次转到对象的定义点时候,而且只有第一次的时候才需要执行构造函数。如果对象既没有带参数的构造函数又没有缺省构造函数则程序将无法通过编译。
三,类中的静态成员
static静态存储的概念可以进一步引用到类中来。c++中的每一个类的对象都是该类的成员的拷贝,一般情况下它们彼此之间没有什么联系,但有时候我们需要让它们之间共享一些数据,我们可以通过全局变量来实现,但是这样的结果是导致程序的不安全性,因为任何函数都可以对这个变量进行访问和修改,而且容易与项目中的其余的名字产生冲突,因此我们需要一种两全其美的方法,既可以当成全局数据变量那样存储,又可以隐藏在类的内部,与类本身联系起来,这样只有类的对象才可以操纵这个变量,从而增加了变量的安全性。
这种变量我们称之为类的静态成员,静态成员包括静态数据成员和静态成员函数。类的所有的静态数据成员有着单一的存储空间而不管类的对象由多少,这些对象共享这块存储区域。因此每一个类的对象的静态成员发生改变都会对其余的对象产生影响。先看下面的例子。
- //**************************************
- // student.cpp
- //**************************************
- 1. #include <iostream.h>;
- 2. #include <string.h>;
- 3. class student{
- 4. public:
- 5. student(char* pname=”no name”){
- 6. cout<<”create one student”<endl;
- 7. strcpy(name,pname);
- 8. number++;
- 9. cout<<number<<endl;
- 10. }
- 11. ~student() {
- 12. cout<<”destruct one student”<<endl;
- 13. number--;
- 14. cout<<number<<endl;
- 15. }
- 16. static number(){
- 17. return number; }
- 18. protected:
- 19. char nme[40]
- 20. staticint number;
- 21. }
- 22. void fn(){
- 23. student s1;
- 24. student s2;
- 25. cout<<student::number<<endl;
- 26. }
- 27. main(){
- 28. fn();
- 29. cout<<student::number<<endl;
- 30. }
复制代码
程序输出结果如下:
- create one student
- 1
- create one student
- 2
- 2
- destruct one student
- 1
- destruct one student
- 0
- 0
复制代码
上面的程序代码中我们使用了静态数据成员和静态函数成员,下面我们先阐述静态数据成员。 |
|