关于static的相关讨论:

 
关于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
 
书本上有这么一句话:当调用一个成员函数时系统会把该对象的其始地址赋给成员函数this指针。而静态成员函数不属于某个对象,他与任何对象都无关,因此静态成员函数不能进行默认访问(即引用数据成员时不指定对象名)。  静态成员函数可以直接引用本类中的静态成员变量,因为静态成员同样属于类的,可以直接引用。

下面有关静态成员函数的讨论:

把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
代码1:

 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值