类和对象,display函数不放在Time类中,而作为类外的普通函数,然后分别在Time 和Date类中将display声明为友元函数。

简介: 类和对象,display函数不放在Time类中,而作为类外的普通函数,然后分别在Time 和Date类中将display声明为友元函数。

类和对象,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米,游泳池半径由键盘输入。要求编程计算并输出过道和栅栏的造价。


3.png


#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;
   } 

通过上面三个例子,类和对象,函数可以声明为友元函数,可以直接调用。

本次分享就到这里了。

相关文章
|
2月前
学习 static 定义静态变量的用法
学习 static 定义静态变量的用法。
52 13
|
1月前
|
JavaScript 前端开发 数据安全/隐私保护
如何使用 Symbol 实现私有属性和方法?
【10月更文挑战第22天】使用 `Symbol` 实现私有属性和方法是一种在JavaScript中模拟封装和隐私保护的有效方式,虽然存在一定的局限性,但在很多实际开发场景中能够满足对代码结构和数据隐藏的需求,提高代码的质量和可维护性。
|
4月前
|
编译器 C++
virtual类的使用方法问题之C++类中的非静态数据成员是进行内存对齐的如何解决
virtual类的使用方法问题之C++类中的非静态数据成员是进行内存对齐的如何解决
|
7月前
|
编译器 C语言 C++
【C++基础 】 --- C++ 为什么需要定义成员函数
【C++基础 】 --- C++ 为什么需要定义成员函数
34 0
|
7月前
|
存储 设计模式 算法
[C++] static静态成员变量/函数的用法
[C++] static静态成员变量/函数的用法
108 1
|
安全
【system verilog】OOP属性下的构造函数new,虚方法virtual和cast方法(5)
【system verilog】OOP属性下的构造函数new,虚方法virtual和cast方法(5)
|
存储 编译器 C语言
C++:类和对象(中)---默认成员函数---运算符重载---const的含义
C++:类和对象(中)---默认成员函数---运算符重载---const的含义
|
编译器 C语言 C++
类和对象---默认成员函数
类和对象---默认成员函数
类和对象---默认成员函数
Date类实现运算符和赋值重载
Date类实现运算符和赋值重载
定义了一个类A,S是类外的一个函数,通过A.S=S进行赋值
假设类 A 已经定义好了,现在可以通过 A.S = S 的方式将函数 S 赋值给类 A。这样做的效果是,将 S 函数作为类 A 的一个属性,并且可以通过该属性来调用函数 S。 下面是一个简单的例子: