实验六 对象传递与静态成员
6.1 实验目的
1.理解静态成员(静态数据成员、静态成员函数)的作用与使用; 2.理解友元(友元函数、友元类)的作用与使用; 3.理解以常数据成员、常对象。
6.2 实验内容 6.2.1程序阅读
1.理解下面的程序,并运行查看结果,回答程序后面的问题。
#include
public:
CStudent(char *n, int a); ~CStudent();
staticvoid SetAge(int age); private:
char *name; int age;
staticint nTotalObj; };
int CStudent::nTotalObj = 0;
CStudent::CStudent(char *n, int a):age(a) {
int nLen = strlen(n);
name = newchar[nLen+1]; strcpy(name,n); name[nLen] = '\\0'; nTotalObj++; }
CStudent::~CStudent() {
delete[] name; nTotalObj--; }
void CStudent::SetAge(int age) {
this->age = age; }
int main() {
CStudent stu1(\张三\,25); CStudent str2(\李四\,26);
cout<<\< return 0; } 问题一:以上程序编译能通过吗,为什么? 答:不能,存在以下错误 a、 静态成员变量nTotalObj声明为private,导致在主函数内不能引用; b、 静态成员函数使用了this指针。 问题二:成员变量nTotalObj在程序中起什么作用,它是如何实现的? 答:对构建的CStudent类对象进行计数的作用,它是通过设置静态成员变量的方式实现的。 问题三:如果规定该程序的主函数不允许改变,应该如何改正该程序? 答:将静态成员变量nTotalObj声明为public,将语句this->age=age;修改为age=age; 2.理解下面的程序,并运行查看结果,回答程序后面的问题。 #include public: CTeacher(char *tn, int ta); ~CTeacher(); void SetStuAge(CStudent &, int a); void display() { cout< char *name; int age; }; class CStudent { public: CStudent(char *n, int a); ~CStudent(); void display() { cout< friend void CTeacher::SetStuAge(CStudent &, int a); private: char *name; int age; }; CStudent::CStudent(char *n, int a):age(a) { int nLen = strlen(n); name = new char[nLen+1]; strcpy(name,n); name[nLen] = '\\0'; } CStudent::~CStudent() { delete[] name; } CTeacher::CTeacher(char *tn, int ta):age(ta) { int nLen = strlen(tn); name = new char[nLen+1]; strcpy(name,tn); name[nLen] = '\\0'; } CTeacher::~CTeacher() { delete[] name; } void CTeacher::SetStuAge(CStudent &s, int a) { s.age = a; } int main() { } CStudent stu(\张三\CTeacher tea(\李四\stu.display(); tea.display(); tea.SetStuAge(stu,23); stu.display(); return 0; 问题一:以上程序有三处错误,试指出来,并改正之? 答:这个程序想要实现的一个核心功能是:教师可以通过SetStuAge方法来修改学生的年龄。这样就需要在学生类中声明CTeacher类的void SetStuAge函数为CStudent类的友元函数。此题很多同学修改后,程序能运行,但并不能实现上述功能。 此题修改的内容已经在程序中用红色标出。 3.理解下面的程序,并运行查看结果,回答程序后面的问题。 #include private: const int year; const int month; const int day; public: Date(int y,int m,int d); void showdate(); }; Date::Date(int y,int m,int d) { year = y; month = m; day = d; } void Date::showdate() { cout< int main() { const Date obj(2007,10,30); obj.showdate(); return } 问题一:以上程序有两大错误,试指出来,并改正之(要求主函数和类Date的数据成员属性不可以改动)?(提示:常数据成员的初始化、常对象的使用) 答: 1、常成员变量的初始化只能采取参数初始化表方式; Date类的构造函数应改为Date::Date(int y,int m,int d):year(y),month(m),day(d){} 2、常对象只能调用常成员函数,因此showdate需要定义为常成员函数,函数声明与定义后需要添加const关键字。修改后的程序如下。 #include private: const int year; const int month; const int day; public: Date(int y,int m,int d); void showdate() const; }; Date::Date(int y,int m,int d):year(y),month(m),day(d){} void Date::showdate() const { cout< int main() { const Date obj(2007,10,30); obj.showdate(); return } 6.2.2 程序设计 1.商店销售某一商品,商店每天公布统一的折扣(discount).同时允许销售人员在销售时灵活掌握售价(price),在此基础上,对于一次购10件以上的客户,还可以享受9.8折优惠.现已知当天3名销售人员的销售情况为: 销售员号(num) 销售件数(quantity)单价(price) 101 5 23.5 102 12 24.56 103 100 21.5 编写程序,计算出当日此商品的总销售款sum,以及每件商品的平均售价.要求用静态数据成员和静态成员函数. 答:此题是书上习题9,主要用来考察大家对静态成员的理解,当时摘抄下来没有细想,现