C++课程学习-实验5

实验目的:

  1. 进一步加深对类和对象的理解
  2. 掌握几种对象传递的使用方法
  3. 掌握静态成员的概念和使用

学习内容(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);
	//Tr* obj_1();
	cout << "调用函数sqr_it前,实参对象obj的数据成员i的值为:" << obj.get_i() << endl;
	sqr_it(obj);//在使用对象指针作为函数参数时,需要将此语句改为:sqr_it(obj);因为,此时实参为对象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);
	//Tr* obj(10);
	cout << "调用函数sqr_it前,实参对象obj的数据成员i的值为:" << obj.get_i() << endl;
	sqr_it(&obj);//在使用对象指针作为函数参数时,需要将此语句改为:sqr_it(&obj);因为,此时实参为对象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);
	//Tr* obj(10);
	cout << "调用函数sqr_it前,实参对象obj的数据成员i的值为:" << obj.get_i() << endl;
	sqr_it(obj);//在使用对象指针作为函数参数时,需要将此语句改为:sqr_it(&obj);因为,此时实参为对象obj的地址
	cout << "调用函数sqr_it后,实参对象obj的数据成员i的值为:" << obj.get_i() << endl;
	return 0;
}

在这里插入图片描述
分析总结:
1.在向函数传递对象时,是通过“传值调用”传递函数的,只由实参传给形参,而不能由形参传回来给实参,函数中对对象的修改不影响该对象实参的值;
2.形参对象指针所指对象的值的改变影响着实参对象的值;
3.使用对象的引用作为形参也能改变对象的实参的值,而且方法比使用指针更加简单;

实验内容(b)

  1. 掌握静态成员的概念和使用;
  2. 由关键字static修饰说明的成员,称为静态成员;
  3. 静态成员为所有对象共享,只有一份存于公共内存中;
  4. 静态成员包括静态数据成员和静态函数成员;

代码:

class Ctext {
	static int count;//私有成员,静态数据成员的定义与普通数据成员类似,但是前边要加上static关键词
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;
	//char name[10];
	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是非静态变量,所以无法进行如此运算。
后改成上面程序段中的形式,使用对象引用得已解决。

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值