实验四 静态成员与友元

2025-06-29

1. 1. 调试下列程序,写出输出结果,并分析输出结果。 #include \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) {

cout<<\ cout<<\}

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.设计一个含有静态成员、静态成员函数的程序,分析程序结果,理解静态成员(函数)与类和对象的关系。 参考程序:

#include class A { friend class B;//友元类的声明 public: void Set(int i){x=i;} friend int add(A & f1);// 友元函数的声明 void Display() { cout<<\ } 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() { cout<<\}

void main() {

A b; b.Set(5);//友元函数的调用 cout<

问题:

(1) 分析友元函数add()的定义、调用与成员函数的区别。

友元函数add()的定义:能够访问类A的私有成员但又不是该类成员函数的函数。

友元函数通过访问类A的私有成员X与Y并将其值输出,但友元函数并不是该类的成员函数;而成员函数本身属于该类的成员函数,一个类的成员函数可作为另一个类的友元函数。

⑵、分析友元类B的成员函数如何引用类A的私有成员的?

友元函数的特点是能够访问类中的私有成员的非成员函数。通过声明一类A的友元函数friend int add(A & f1);,就可以用这个函数直接访问类A的私有成员了。

⑶、根据运行结果分析下列程序中静态成员B值的变化和静态成员函数的引用方式。

#include 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)//在静态成员函数中对不同类型成员的引用方式 { cout<<\引用类的非静态成员,用点域法 cout<<\引用类的静态成员,直接引用 }

void main() { M P(5),Q(10); M::f1(P);//调用静态成员函数 M::f1(Q);

}

3.分析并调试程序,完成下列问题。 #include \#include \class My {

public:

My(double i=0) { x=y=i; }

My(double i,double j) {x=i; y=j;} My(My &m) {x=m.x; y=m.y;} friend double dist(My &a,My &b); private:

double x,y; };

double dist(My &a,My &b) {

double dx=a.x-b.x; double dy=a.y-b.y;

return sqrt(dx*dx+dy*dy); }

int main() {

My m1,m2(15),m3(13,14); My m4(m3);

cout<<\ cout<<\ cout<<\ cout<<\ return 0; }

(2) 指出所有的构造函数,它们在本程序中分别起什么作用?

答:My(double i=0) { x=y=i; } //初始化变量i的值,并将i的值赋给x和y. My(double i,double j) {x=i; y=j;}// 将变量i和j的值分别赋给x和y. My(My &m) {x=m.x; y=m.y;} //访问静态成员函数x和y。 My m1,m2(15),m3(13,14); //给m1,m2,m3赋值。 My m4(m3); //将m3的值赋给m4.

(3) 指出友元函数。将友元函数放到私有部分,观察结果是否有变化。 friend double dist(My &a,My &b);为友元函数。

答:没有变化,因为既可以在类的私有部分声明友元,也可以在类的公有部分声明友元,这两种做法语义相同

(4) 写出输出结果,并分析结果。 正确程序:#include \

#include \class My {

public:

My(double i=0) { x=y=i; }

My(double i,double j) {x=i; y=j;} My(My &m) {x=m.x; y=m.y;} friend double dist(My &a,My &b); private:

double x,y; };

double dist(My &a,My &b) {

double dx=a.x-b.x; double dy=a.y-b.y;

return sqrt(dx*dx+dy*dy); }

int main() {

My m1,m2(15),m3(13,14); My m4(m3);

cout<<\ cout<<\ cout<<\ cout<<\ return 0; }

分析:

通过定义友元函数friend double dist(My &a,My &b);可以访问类my的派生类。

4 .编写程序,统计某旅馆住宿客人的总数,要求输入客人姓名,输出客人编号(按先后顺序自动生成),姓名以及总人数。依次输入旅客的名字,按“!”结束输入,之后则显示旅客编号和姓名;

程序源代码如下 :

#include \#include \#include %using namespace std; class keren { public:


实验四 静态成员与友元.doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:2024届湖北湖南各市一模二模化学工艺汇编模板(含有详细解析)

相关阅读
本类排行
× 游客快捷下载通道(下载后可以自由复制和排版)

下载本文档需要支付 7

支付方式:

开通VIP包月会员 特价:29元/月

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信:xuecool-com QQ:370150219