当前位置:文档之家› 实验6 类和对象2

实验6 类和对象2

cout<<"After called : void Test2(Date &r):"<<endl; t.Print(); //6.经过函数调用,对象数据成员被修改了吗?为什么?
//7.your code here 调用 Test3,将对象 t 传入
//8.在上面的调用语句处加断点进行调试,查看对象指针作形参情况下,实参与形参结合过程调 用构造函数了吗?有无新对象创建?
成员函数(公开): 无参构造函数:Student( ) 1) 通过 Date 有参构造函数初始化对象 birthday,初始化为 1990,1,1 2) 初始化常量成员 SCORE_NUMBER 3) 开辟与指针成员 score 相应的堆空间(空间大小由 SCORE_NUMBER 确定) 4) 平均值 average 初始化为 0 5) 修改 count 值,使对象数加 1
Date *p2[4]={new Student(1990,1,1),t+1,t+2,t+3}; //15.上句中的 p1 是指针还是数组?执行过程中伴随对象的创建吗?会调用构造函数吗?
Date (*p3)[4]; //16.本句定义的 p3 是指针还是数组?执行过程中伴随对象的创建吗?会调用构造函数 吗? p3=&t; //17.这样赋值正确吗? const Date d5=d2;//常对象定义时必须初始化 //d5.Print();//18.取消本句前注释符号,编译有问题吗?为什么?修改相关代码使本句编译通过。
Date s[4]; //7.对象数组 s 创建过程调用几次构造函数?什么构造函数? for(int i=0;i<sizeof(s)/sizeof(Date);i++)//8. sizeof(s)/sizeof(Date)等于几?为什么?
s[i]=Date(1990, i+1,i+1); //显示调用构造函数,创建临时无名对象。 //9.断点调试查看上面的赋值语句执行过程中调用了什么构造函数?伴随拷贝构造函数的调用吗?为什 么?
cout<<"After called : void Test1(Date d):"<<endl; t.Print(); //3.经过函数调用,对象数据成员被修改了吗?为什么? //4.your code here 调用 Test2,将对象 t 传入
//5.在上面的调用语句处加断点进行调试,查看对象引用作形参情况下,实参与形参结合过程调 用构造函数了吗?结果意味着什么?(有无新对象创建?形参与实参是一个对象,还是两个不同的对 象?)
9) 注意 2:指针成员不能直接用参数赋值,如 this->score=score; 需要利用 new 动态创建 score 指向的空间,然后利用循环对每个元素赋值
10) 注意 3:对数组成员 name 赋值时,不能对数组名赋值,利用字符串赋值函数 strcpy 完成内 容拷贝。
有参构造函数 2:Student(char *name, Date t,int score_number=2, double *score=NULL) 11) 通过 Date 有参构造函数初始化对象 birthday,用参数 t 进行初始化 12) 用参数 score_number 初始化常量成员 SCORE_NUMBER 13) 用参数 name 设置 this->name 数组 14) 开辟与指针成员 score 相应的堆空间(空间大小由 SCORE_NUMBER 确定) 15) 如果参数 score!=NULL,则用其指向的数组元素值为 this->score 指向的数组空间赋值 16) 平均值 average 初始化为 0 17) 修改 count 值使对象数加 1 18) 注意 1:形参与数据成员同名时的区分方法:this 指针,如 this->name; 19) 注意 2:指针成员不能直接用参数赋值,如 this->score=score; 需要利用 new 动态创建 score 指向的空间,然后利用循环对每个元素赋值 20) 注意 3:对数组成员 name 赋值时,不能对数组名赋值,利用字符串赋值函数 strcpy 完成内 容拷贝。
实验六 类与对象 2
实验目的 熟悉类的基本结构和定义方法; 深刻理解类的构造函数的作用,学会分析对象的各种组合定义形式中构造函数的调用细节(调用哪个
构造函数,调用顺序等); 掌握友元的作用及其声明方式; 掌握类的静态数据成员和静态函数成员的用法; 掌握类的指针成员的使用特点; 了解动态内存与非动态内存的区别,掌握动态内存的开辟、应用和删除这三项基本操作,理解动态内
之外),下面的输Байду номын сангаас语句一定导致编译错误。在 Date 中将下面的函数声明为其友元,使下面的访问合 法化。friend void Test4(Date t); void Test4(Date t) {
cout<<t.y<<”-”<<t.m<<”-”<<t.d<<endl; }
2) 友元类: class A { int a; public: A(){a=0;} A(int a){this->a=a;} void FriendTest(Date t) { cout<<t.y<<”-”<<t.m<<”-”<<t.d<<endl; } }
Date *p1[4];//12.该语句定义的 p1 是指针还是数组?执行过程中伴随对象的创建吗?会调用构造函数吗? for(i=0;i<sizeof(p1)/sizeof(Date*);i++) {
p1[i]=new Date(1990, i+1,i+1); //13.上句执行过程中创建的对象是放在堆区还是栈区?p1[i]中保存的是什么? } //14.your code here 利用 p1[2]调用 Print()函数
有参构造函数 1:Student(char *name, int y=1990,int m=1,int d=1, int score_number=2, double *score=NULL) 1) 通过 Date 有参构造函数初始化对象 birthday,初始化为参数 y,m,d 的值 2) 用参数 score_number 初始化常量成员 SCORE_NUMBER 3) 用参数 name 设置 this->name 数组 4) 开辟与指针成员 score 相应的堆空间(空间大小由 SCORE_NUMBER 确定) 5) 如果参数 score!=NULL,则用其指向的数组元素值为 this->score 指向的数组空间赋值 6) 平均值 average 初始化为 0 7) 修改 count 值使对象数加 1 8) 注意 1:形参与数据成员同名时的区分方法:this 指针,如 this->name;
//19.your code here 释放本例中开辟的所有堆空间
}
3. 在 Date 类基础上添加以下 3 个全局函数: void Test1(Date d) { d.SetDate(2001,1,1); }
void Test2(Date &r) {
r.SetDate(2002,2,2); }
void Test3(Date *p) {
p->SetDate(2003,3,3); } 1) 在文件头部添加以上 3 个函数的原型声明 2) 用以下的主函数进行测试:
void main() {
Date t(2000,10,10); //1.your code here 调用 Test1,将对象 t 传入
//2.在上面的调用语句处加断点进行调试,查看对象作形参情况下,实参与形参结合过程调用构 造函数了吗?结果意味着什么?(有无新对象创建?形参与实参是一个对象,还是两个不同的对象?)
cout<<"After called : void Test3(Date *p):"<<endl; t.Print(); //9.经过函数调用,对象数据成员被修改了吗?为什么? }
4. 在以上 Date 类的基础上,定义一个学生类 Student(数据成员包括一个 Date 类的对象 birthday)要求如下: 数据成员(私有): 姓名:char name[10] 出生日期:Date birthday 成绩:double* score 当前学生对象总数:static int count 成绩门数:const int SCORE_NUMBER 成绩平均值:double average
Date t[4]={Date(1990,1,1),Date(1990,2,2)}; //10. 断点调试查看对象数组 t 创建过程调用几次构造函数?分 别是什么构造函数?体会对象数组初始化列表中的 Date(1990,1,1)与上面 s[i]=Date(1990,i,i);中相应表达式 的区别。
Date *p=&d1; //11.对象指针创建过程伴随对象的创建吗?有调用构造函数吗? 体会指针变量只创建 4 字 节地址空间,并不负责创建其指向对象的实体空间。 cout<<” Date *p =&d1; sizeof(p)=”<< sizeof(p)<<endl; //上句输出结果是什么?为什么?
如果我们试图在类 A 的所有成员函数中直接访问 Date 的私有成员,则可以在 Date 中声明 A 为
其友元类。friend class A 如果我们只希望在 A 的 void FriendTest(Date t)函数中可以直接访问 Date 的私有成员,则可以在
Date 中声明该函数为友元函数,思考如何写? 友元具有单向性:在 Date 中声明 A 为其友元类,只能在 A 中破例访问 Date 的私有成员,但不
相关主题