类和对象,display函数不放在Time类中,而作为类外的普通函数,然后分别在Time 和Date类中将display声明为友元函数。
今天,我们通过学习三个例子来加深我们对类和对象的理解。
例1.
(1)商店销售某一商品,商店每天公布统一的折扣(discount)。同时允许销售人员在销售时灵活掌握售价(price),在此基础上,对一次购10件以上者,还可以享受9.8折优惠。现已知当天3个销售员销售情况为:
销货员号(num) 销售件数(quantity) 销货单价(price)
101 5 23.5
102 12 24.56
103 100 21.5
请编写程序,计算当日此商品的总销售款sum以及每件商品的平均售价。要求用静态数据成员和静态成员函数。
提示:将折扣discount,总销售款sum和销售总件数n声明为静态数据成员,再定义静态成员函数average(求平均售价)和display(输出结果)。
#include <iostream> using namespace std; class Sale { private: static int n; // 静态数据成员:商品销售总件数 static float sum; // 静态数据成员:总销售款 static float discount; // 静态数据成员:折扣 int num; // 非静态数据成员:销货员号 int quantity; // 非静态数据成员:销货件数 float price; // 非静态数据成员:销货单价 public: Sale(int n, int q, float p) :num(n), quantity(q), price(p) {}; // 定义构造函数 void total(); // 非静态成员函数:求总销售款 static float average(); // 静态成员函数:求平均售价 static void display(); // 静态成员函数:输出结果 }; int main() { Sale salesman[3] = { // 定义对象数组,参考我的上两篇博客 Sale(101, 5, 23.5), // 调用构造函数,提供第1个元素的实参 Sale(102, 12, 24.56), // 调用构造函数,提供第2个元素的实参 Sale(10., 100, 21.5) // 调用构造函数,提供第3个元素的实参 }; for (int i = 0; i < 3; i++) salesman[i].total(); // 调用3次 total 函数 Sale::display(); // 调用静态成员函数 display system("pause"); return 0; } // 静态数据成员初始化 int Sale::n = 0; float Sale::sum = 0; float Sale::discount = 0.01; void Sale::total() // 定义非静态成员函数 total() { float rate = 1.0; if (quantity>10) rate = 0.98 * rate; // 一次性购10件以上,享受98折优惠 sum = sum + quantity * price * rate * (1 - discount); // 计算销售额:销货件数 * 单价 * 折扣 n = n + quantity; // 累加销货件数 } float Sale::average() // 定义静态成员函数 average() { // 静态成员函数可以直接引用本类的静态成员 return (sum / n); } void Sale::display() // 定义静态成员函数 display() { // 静态成员函数可以直接引用本类的静态成员 cout << "Average:" << average() << endl; cout << "Sum:" << sum << endl; }
例2.
(2)将例3.13程序中的display函数不放在Time类中,而作为类外的普通函数,然后分别在Time 和Date类中将display声明为友元函数。在主函数中调用display函数,display函数分别引用Time和Date两个类的对象的私有数据,输出年、月、日和时、分、秒。
#include <iostream> using namespace std; class Date; class Time {public: Time(int,int,int); friend void display(const Date &,const Time &); private: int hour; int minute; int sec; }; Time::Time(int h,int m,int s) {hour=h; minute=m; sec=s; } class Date {public: Date(int,int,int); friend void display(const Date &,const Time &); private: int month; int day; int year; }; Date::Date(int m,int d,int y) {month=m; day=d; year=y; } void display(const Date &d,const Time &t) { cout<<d.month<<"/"<<d.day<<"/"<<d.year<<endl; cout<<t.hour<<":"<<t.minute<<":"<<t.sec<<endl; } int main() { Time t1(10,13,56); Date d1(12,25,2004); display(d1,t1); return 0; }
例3.
(3) 一圆型游泳池如图所示,现在需在其周围建一圆型过道,并在其四周围上栅栏。栅栏价格为35元/米,过道造价为20元/平方米。过道宽度为3米,游泳池半径由键盘输入。要求编程计算并输出过道和栅栏的造价。
#include<iostream> using namespace std; const float PI=3.14159; const float FencePrice=35; const float ConcretePrice=20;//声明Circle及其数据和方法 class Circle { private: float radius; public: setRadius(float r);//设置半径,把外部数据赋值给私有成员数据时,函数要有形式参数 float Circumference();//圆周长 float Area();//圆面积 };//类的实现 //初始化数据成员radius Circle::setRadius(float r) {radius=r;} float Circle::Circumference() { return 2*PI*radius; }//计算周长 float Circle::Area() { return PI*radius*radius; } //计算面积 int main() { float radius; float FenceCost,ConcreteCost; cout<<"Enter the radius of the pool:"; //提示用户输入半径 cin>>radius; Circle Pool; Circle PoolRim;//声明类的对象 Pool.setRadius(radius); PoolRim.setRadius(radius+3);//调用赋值函数将外界的数据传递给类内部的相对应的私有数据 FenceCost=PoolRim.Circumference()*FencePrice; cout<<"Fencing Cost is ¥"<<FenceCost<<endl;//计算栅栏造价并输出 ConcreteCost=(PoolRim.Area()-Pool.Area())*ConcretePrice;//调用函数计算过道价格 cout<<"Concrete Cost is ¥"<<ConcreteCost<<endl; }
通过上面三个例子,类和对象,函数可以声明为友元函数,可以直接调用。
本次分享就到这里了。