关于static的相关讨论:
1)类中的静态成员变量;
类中的静态成员变量不属于某个对象所有,而是同一个类的不同对象共有的。他只占一个内存空间(而不是为每个对象都保留一个内存空间)。每一个对象都可以引用这个变量,而且他对每一个成员都是一样的。如果改变他的值,则对象中这个值都变了。
如果声明了一个类,如果没有对他定义对象,则类的一般数据成员不占内存空间,只有定义了对象才占内存空间。但静态成员变量不属于某个对象,在为对象分配内存空间时不包括静态成员所占的内存空间。他是在所有类对象中单独开辟的,即使不定义类对象,这个成员也占内存空间。可以被引用。
静态成员可以初始化,但只能在类体外进行。他可以通过对象名引用也可以通过类名引用。
观察程序:
1)
#include<iostream>
using namespace std;
class stu
{
static int a;
int b;
public:
stu();
如果改成:stu::stu()
{
stu::stu()
{
a=1;
b=2;
}
void stu::print()
b=2;
}
int stu::a=1;
就不会出错。
|
void print();
};
{
cout<<a<<" "<<b<<endl;
}
int main()
{
stu aa;
aa.print();
return 0;
}
此程序在编译时没有发现什么错误,但在连接时出现了两个错误。
wjh.obj : error LNK2001: unresolved external symbol "private: static int stu::a" (?a@stu@@0HA)
Debug/wjh.exe : fatal error LNK1120: 1 unresolved externals
Error executing link.exe.
但把关键字static去掉就不出现问题了。
2)
#include<iostream>
using namespace std;
class stu
{
public:
void print();
};
void stu::print()
{
static int b=1;
cout<<" "<<b++<<endl;
}
int main()
{
stu aa[5];
int i;
for(i=0;i<5;i++)
aa[i].print();
getchar();
return 0;
}
输出结果:
1
2
3
4
5
这说明了成员函数中的静态成员变量也是作用于所有的类对象的。
这说明了成员函数中的静态成员变量也是作用于所有的类对象的。
3)
#include<iostream>
using namespace std;
class stu
{
int a,b;
public:
void print();
};
void stu::print()
{
static int b=1;
cout<<" "<<b++<<endl;
}
int main()
如果把aa改为aa[5],则输出40
|
stu aa;
cout<<sizeof(aa)<<endl;
getchar();
return 0;
}
结果输出:8
把pint函数删除,输出的结果依然为8
这是否说明了类中的函数体不占用内存,但为什么不占用内存?
Static 变量实际上可以看作是一个全局变量,只是他有自己 的作用范围。在一个函数中定义,他只作用于定义的一类函数中,不经特别申请不能被别的函数调用。在调用函数时不为这函数中的静态成员分配地址,因为他的地址是在编译时已经分配。Static变量实现了数据在一类函数中的共享。
在类中,成员函数不占用内存。经过测试,一个类所占用的内存只与他所定义的变量个数和种类有关。关于类的赋值问题还须待进一步讨论。
#include<iostream>
using namespace std;
class stu
{
int a;
public:
static void display();
};
void stu::display()
{
cin>>a;
cout<<" "<<a<<endl;
}
int main()
{
stu aa;
aa.display();
getchar();
return 0;
}
调试结果:
C:/Program Files/Microsoft Visual Studio/MyProjects/wjh1/wjh1.cpp(11) : error C2597: illegal reference to data member 'stu::a' in a static member function
C:/Program Files/Microsoft Visual Studio/MyProjects/wjh1/wjh1.cpp(12) : error C2597: illegal reference to data member 'stu::a' in a static member function
|
下面有关静态成员函数的讨论:
把a定义成为static变量,调试通过,但连接出错:wjh1.obj : error LNK2001: unresolved external symbol "private: static int stu::a" (?a@stu@@0HA)
Debug/wjh1.exe : fatal error LNK1120: 1 unresolved externals
为什么调用本类中的静态成员会出错?
|
把a变成共有的静态成员变量,还是 有错误:wjh1.obj : error LNK2001: unresolved external symbol "public: static int stu::a" (?a@stu@@2HA)
Debug/wjh1.exe : fatal error LNK1120: 1 unresolved externals
|