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
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
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: