实验目的:
- 进一步加深对类和对象的理解
- 掌握几种对象传递的使用方法
- 掌握静态成员的概念和使用
学习内容(a):
了解三种不同的对象传递方式,分别为:
1.使用对象作为函数参数
class Tr {
public:
Tr(int n)
{
i = n;
}
void set_i(int n)
{
i = n;
}
int get_i()
{
return i;
}
private:
int i;
};
void sqr_it(Tr ob)
{
ob.set_i(ob.get_i() * ob.get_i());
cout << "在函数sqr_it内,形参ob的数据成员i的值为:" << ob.get_i();
cout << endl;
}
int main()
{
Tr obj(10);
cout << "调用函数sqr_it前,实参对象obj的数据成员i的值为:" << obj.get_i() << endl;
sqr_it(obj);
cout << "调用函数sqr_it后,实参对象obj的数据成员i的值为:" << obj.get_i() << endl;
return 0;
}
2.使用对象指针作为函数参数
class Tr {
public:
Tr(int n)
{
i = n;
}
void set_i(int n)
{
i = n;
}
int get_i()
{
return i;
}
private:
int i;
};
void sqr_it(Tr* ob)
{
ob->set_i(ob->get_i() * ob->get_i());
cout << "在函数sqr_it内,形参ob的数据成员i的值为:" << ob->get_i();
cout << endl;
}
int main()
{
Tr obj(10);
cout << "调用函数sqr_it前,实参对象obj的数据成员i的值为:" << obj.get_i() << endl;
sqr_it(&obj);
cout << "调用函数sqr_it后,实参对象obj的数据成员i的值为:" << obj.get_i() << endl;
return 0;
}
3.使用对象引用作为函数参数
class Tr {
public:
Tr(int n)
{
i = n;
}
void set_i(int n)
{
i = n;
}
int get_i()
{
return i;
}
private:
int i;
};
void sqr_it(Tr& ob)
{
ob.set_i(ob.get_i() * ob.get_i());
cout << "在函数sqr_it内,形参ob的数据成员i的值为:" << ob.get_i();
cout << endl;
}
int main()
{
Tr obj(10);
cout << "调用函数sqr_it前,实参对象obj的数据成员i的值为:" << obj.get_i() << endl;
sqr_it(obj);
cout << "调用函数sqr_it后,实参对象obj的数据成员i的值为:" << obj.get_i() << endl;
return 0;
}
分析总结: 1.在向函数传递对象时,是通过“传值调用”传递函数的,只由实参传给形参,而不能由形参传回来给实参,函数中对对象的修改不影响该对象实参的值; 2.形参对象指针所指对象的值的改变影响着实参对象的值; 3.使用对象的引用作为形参也能改变对象的实参的值,而且方法比使用指针更加简单;
实验内容(b)
- 掌握静态成员的概念和使用;
- 由关键字static修饰说明的成员,称为静态成员;
- 静态成员为所有对象共享,只有一份存于公共内存中;
- 静态成员包括静态数据成员和静态函数成员;
代码:
class Ctext {
static int count;
public:
Ctext()
{
++count;
cout << "对象数量=" << count << '\n';
}
};
int Ctext::count = 0;
int main(void)
{
Ctext a[3];
return 0;
}
实验内容(c)
实验要求:
1.创建一个TStudent类,完成以下功能: 2.该类包括三个函数: InitStudent、 ExpendMoney和ShowMoney; 3.采用float m_ ClassMoney变量作为静态变量,用于存储班级的班费, 初始值设为1000; 4.InitStudent (char name)主要负责完成学生姓名的初始化; 5.ExpendMoney(float money)主要完成班费的花销计算; 6.ShowMoney()主要完成班费余额显示; 7.主程序中分别定义A、B、C三个学生,每个学生为一个对象,每个学生分别消费班费50,98.5,500.53,最后显示班费的余额。
代码(方法1-直接在主函数赋予函数参数):
class TStudent {
private:
float spent_money;
static float m_ClassMoney;
public:
TStudent();
void InitStudent(char name);
void ExpendMoney(float money);
void ShowMoney();
};
float TStudent::m_ClassMoney = 1000;
TStudent::TStudent()
{
}
void TStudent::InitStudent(char name)
{
}
void TStudent::ExpendMoney(float money)
{
m_ClassMoney = m_ClassMoney - money;
}
void TStudent::ShowMoney()
{
cout << "班费剩余金额为:" << m_ClassMoney << endl;
}
int main()
{
TStudent a, b, c;
a.InitStudent('a');
a.ExpendMoney(50);
a.ShowMoney();
b.InitStudent('b');
b.ExpendMoney(98.5);
b.ShowMoney();
c.InitStudent('c');
c.ExpendMoney(500.53);
c.ShowMoney();
return 0;
}
代码(方法2-使用对象引用作为函数参数):
class TStudent{
private:
float spent_money;
char name[10];
static float m_ClassMoney;
public:
TStudent(float money);
void InitStudent(TStudent& obj);
void ExpendMoney(TStudent& obj);
void ShowMoney();
};
float TStudent::m_ClassMoney = 1000;
TStudent::TStudent(float money)
{
spent_money = money;
}
void TStudent::InitStudent(TStudent& obj)
{
cout << "请输入该消费者的姓名:";
cin >> obj.name;
cout << obj.name << "消费了" << obj.spent_money << endl;
}
void TStudent::ExpendMoney(TStudent& obj)
{
m_ClassMoney = m_ClassMoney - obj.spent_money;
}
void TStudent::ShowMoney()
{
cout << "班费剩余金额为:" << m_ClassMoney << endl;
}
int main()
{
TStudent a(50), b(98.5), c(500.53);
a.InitStudent(a);
a.ExpendMoney(a);
a.ShowMoney();
b.InitStudent(b);
b.ExpendMoney(b);
b.ShowMoney();
c.InitStudent(c);
c.ExpendMoney(c);
c.ShowMoney();
return 0;
}
出现的问题:
因为m_ClassMoney是静态变量,而spend_money是非静态变量,所以无法进行如此运算。 后改成上面程序段中的形式,使用对象引用得已解决。
|