- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
实验六 静态成员与友元
姓名:王永杰 10电子 学号:1014860069
【实验目的】
掌握友元函数的定义、使用方法以及特点。
握静态成员函数和静态数据成员的功能。
【实验内容】
调试下列程序,写出输出结果,并分析输出结果。
#include iostream.h
class My
{
public:
My(int aa)
{
A=aa;
B-=aa;
}
static void fun(My m);
private:
int A;
static int B;
};
void My::fun(My m)
{
coutA=m.Aendl;
coutB=Bendl;
}
int My::B=100;
int main()
{
My P(6),Q(8);
My::fun(P);
Q.fun(Q);
return 0;
}
运行结果:
分析:1. 静态数据成员属于类,普通数据成员属于某一对象
2. 在类中不给静态数据成员分配内存空间;
???????????? 3. 静态数据成员与静态变量一样,是在编译时创建并初始化,它在该类的任何对象被建立之前就存在;
???????????? 4. 静态数据成员不能在类中进行初始化,必须在类外的其他地方为它提供定义;一般在main()开始之前、类的声明之后的特殊地
???????????????? 带为它提供定义和初始化;
???????????? 5. 私有静态数据成员不能被类外部函数访问,也不能用对象进行访问。
2.设计一个含有静态成员、静态成员函数的程序,分析程序结果,理解静态成员(函数)与类和对象的关系。
参考程序:
#includeiostream.h
class A
{
friend class B;//友元类的声明
public:
void Set(int i){x=i;}
friend int add(A f1);// 友元函数的声明
void Display()
{
coutx=x,y=yendl;
}
private:
int x;
static int y;
};
int add(A f1)
{return f1.x+1;}
class B
{
public:
B(int i,int j);
void Display();
private:
A a;//A类的对象a作为类B的私有成员
};
int A::y=1;//静态成员必须先赋初值
B::B(int i,int j)
{
a.x=i;
A::y=j;
}
void B::Display()
{
coutx=a.x,y=A::yendl;
}
void main()
{
A b;
b.Set(5);//友元函数的调用
coutadd(b)endl;
b.Display();
B c(6,9);//a.x=6,X::y=9;
c.Display();
b.Display();
}
结果:
问题:
(1)分析友元函数add()的定义、调用与成员函数的区别。
友元函数add()的定义:能够访问类A的私有成员但又不是该类成员函数的函数。
友元函数通过访问类A的私有成员X与Y并将其值输出,但友元函数并不是该类的成员函数;而成员函数本身属于该类的成员函数,一个类的成员函数可作为另一个类的友元函数。
⑵、分析友元类B的成员函数如何引用类A的私有成员的?
友元函数的特点是能够访问类中的私有成员的非成员函数。通过声明一类A的友元函数friend int add(A f1);,就可以用这个函数直接访问类A的私有成员了。
⑶、根据运行结果分析下列程序中静态成员B值的变化和静态成员函数的引用方式。
#includeiostream.h
class M
{
public:
M(int a){A=a;B+=a;}
static void f1(M m);//静态公有成员函数声明
private:
int A;
static int B;//静态私有成员
};
int M::B=0;
void M::f1(M m)//在静态成员函数中对不同类型成员的引用方式
{
coutA=m.Aendl;//引用类的非静态成员,用点域法
coutB=Bendl;//引用类的静态成员,直接引用
}
void main()
{
M P(5),Q(10);
M::f1(P);//调用静态成员函数
M::f1(Q);
}
3.分析并调试程序,完成下列问题。
#include iostream.h
#include cmath.h
class My
{
public:
M
文档评论(0)