自定义类练习

一、题目

请编写一个书类(Book),可包含数据成员(不限于以下成员,自行设计):书名、单价、出版社(涉及到字符串的,请使用C++string类型)......

必须包含如下成员:

(1)普通构造函数(构造函数应重载)

(2)拷贝构造函数

(3)析构函数

(4)设置静态数据成员和成员函数,比如总价、平均值

其他成员函数请自行设计,丰富类的功能。

要求:数据成员设置成私有

在主函数测试:

(1)创建一个对象(一本书)

(2)使用(1)中的对象克隆5个对象(使用对象数组)。

(3)结合循环输出查看对象数组数据

(4)其他功能请自行测试.....

二、解题

(1)解题思路:

①定义书本类,数据成员有书名、单价、出版社,静态数据成员有总价、总书本数、书价平均值,成员函数有带部分默认值的构造函数、不带默认值的构造函数、析构函数、复制函数、输出数据成员函数、修改数据成员函数、静态成员函数

②类外初始化静态成员,类外定义部分成员函数

③主函数定义数组复制已定义的对象

④测试是否创建对象成功、是否复制成功、未调用静态成员函数是否静态数据成员会改变、全传参对象、部分传参对象、不传参对象

⑤使用string类定义字符串

(2)运行界面:

 (3)代码

#include<iostream>

#include<string>

using namespace std;

class xh_book//新华的书

{

private:

	string b_name;//书名

	float u_price;//单价

	string public_house;//出版社

	static float total;//总价

	static float aver_a;//所有书价平均值

	static int a_n;//总书数

public:

	xh_book();

	//不全带默认值,避免定义不传参对象时不知道使用哪个普通构造函数

	xh_book(string name, float price = 88.88, string house = "中山大学新华学院出版社"):b_name(name),u_price(price),public_house(house){}

	~xh_book();//析构函数

	xh_book(const xh_book&);//拷贝函数

	static void cal_aver();

	void out();//输出三个数据成员

	void xiugai()//修改数据成员

	{

		cout << "依次输入修改后的书名、单价、出版社:";

		cin >> this->b_name >> this->u_price >> this->public_house;

		return;

	}

	void in()//每本书价格相加

	{

		total += u_price;

		++a_n;//书总数加一

		return;

	}

};

float xh_book::total = 0;

int xh_book::a_n = 0;

void xh_book::out()

{

	cout << "书名:" << b_name << endl

		<< "单价:" << u_price << endl

		<< "出版社:" << public_house << endl;

	return;

}

void xh_book::cal_aver()

{

	cout << "所有书本总价格:" << total << endl

		<< "总书本数:" <<  a_n <<endl;

	cout << "平均值:" <<  ((a_n == 0) ? 0 : (total / a_n)) << endl;//无书本时输出 0 ,有书本时输出平均值

}

xh_book::xh_book(const xh_book& copy_ed)

{

	b_name = copy_ed.b_name;

	u_price = copy_ed.u_price;

	public_house = copy_ed.public_house;

}

xh_book::xh_book()

{

	b_name = "清明节放假通知";

	u_price = 0.5;

	public_house = "中山大学教务处";

}

xh_book:: ~xh_book() { cout << "析构函数被调用……" << endl; }

int main()

{

	xh_book b1("四级单词书", 78.9, "清华大学出版社");//创建一个对象

	b1.out();//输出测试是否创建成功,私有数据只能通过公有成员函数间接访问

	b1.cal_aver();//查看总价和平均值,预期输出为 0 ,因为没调用 in 函数改变静态数据成员

	xh_book b_array[5] = { b1,b1,b1,b1,b1};

	for (int i = 0; i < 5; ++i)

	{

		b_array[i].in();

		b_array[i].out();

	}

	b1.cal_aver();//因为总价等是静态成员,预期输出不再为 0 ,而是后面创建的 5 个对象的平均值

	b_array[0].cal_aver();

	b_array[3].cal_aver();//因为静态数据成员相当于类内的全局变量,所以任何本类对象都可以访问到改变后的静态数据成员,并且一样

	xh_book b2;//不传参,调用不带默认值的普通构造函数,不能给写 b2(),系统会认为是声明函数

	b2.out();//检验

	xh_book b3("高等数学");//只传书名,价格和出版社不变

	b3.out();

	b3.xiugai();//修改高等数学这本书

	b3.out();



	return 0;

}

(4)总结:

①静态数据成员一定要初始化且在类外

②定义了无形参构造函数就不要再定义全带默认值的构造函数

③复制构造函数形参加const保护被复制的对象

④静态成员函数不能访问操作非静态数据成员

⑤静态数据成员改变了,再使用任何对象访问都是改变后的数据

⑥类外定义成员函数要在数据类型和函数名中间加类名::

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值