linqy的个人博客分享 http://blog.sciencenet.cn/u/linqy

博文

友元函数以及插入操作符重载函数的声明和应用

已有 2184 次阅读 2017-7-4 14:50 |个人分类:C++|系统分类:科研笔记| 友元函数、插入操作符

在一个类中,类对象的私有成员只能由该类的成员函数访问,外部定义的其他函数和其他类中定义的成员函数都不得访问,这些外部函数只能通过该类提供的公用成员函数进行访问,这样有利于数据的隐藏和保护,符合面向对象的程序设计要求。但是当一个函数或一个类与另一个类关系比较密切,即他们需要经常访问另一个类中的数据(包括私有成员)时,可以将外部函数或是外部的类声明为另一个类的友元函数或是友元类。

对于系统的所有操作符,一般情况下,只支持基本数据类型和标准库中提供的class,对于用户自己定义的class,如果想支持基本操作,比如比较大小,判断是否相等,等等,则需要用户自己来定义关于这个操作符的具体实现。那么为什么叫重载呢?这是因为,在编译器实现的时候,已经为我们提供了这个操作符的基本数据类型实现版本,但是现在他的操作数变成了用户定义的数据类型class,所以,需要用户自己来提供该参数版本的实现

下面的代码给出了友元类的声明和使用,以及插入操作符的声明和使用。

#include <fstream>
#include <stdlib.h>
#include <string>

class Franction;
istream& operator >> (istream&, Franction&);
ostream& operator << (ostream&, Franction&);


void main()
{
   Franction a(5,8),b,c;
   cin>>b;
   b++;
   c = a+b;
   cout<<a<<endl;
   cout<<b<<endl;
   cout<<c<<endl;
   cout<<(a > b ? 1:0)<<endl;

}


class Franction
{//定义分数类
   int nume;
   int demo;
public:
   friend istream& operator >> (istream&, Franction&);//声明进行分数输入的提取操作符重载函数为该类的友元函数
   friend ostream& operator << (ostream&, Franction&);//声明进行分数输出的提取操作符重载函数为该类的友元函数
   void Fransimp();
   Franction()
   {//无参构造函数,将分子和分母分别设为0和1
       nume = 0;
       demo = 1;
   }
   Franction(int n,int d)
   {//带参数的构造函数
       nume = n;
       demo = d;
   }
   void InNume(int n)
   {//重置分子
       nume = n;
   }
   void InDemo(int d)
   {//重置分母
       demo = d;
   }
   int GetNume()
   {//去除分子的值
       return nume;
   }
   int GetDemo()
   {
       return demo;
   }
   Franction operator + (Franction x)
   {//返回两个分数的和
       Franction c;
       c.nume = nume*x.demo + demo*x.nume;//计算分子
       c.demo = demo * x.demo;//计算分母
       c.Fransimp();//对分数进行化简
       return c;//返回分数
   }
   int operator == (Franction& x)
   {//若分数*this和x的值相等,返回1,否则返回0
       return nume*x.demo == demo*x.nume;
   }
   int operator > (Franction& x)
   {//若分数this大于分数x的值,则返回1,否则返回 0
       if (nume * x.demo > demo * x.nume)
       {
           return 1;
       }
       else
           return 0;
   }
   Franction& operator ++()
   {//先使函数增1,然后返回函数的额指针
       nume += demo;
       return *this;
   }
   Franction& operator ++(int)
   {//使函数加1,但是返回的是源分数的值
       Franction y = *this;
       nume += demo;
       return y;
   }
};
void Franction::Fransimp()
{
   int r,m,n;
   n = demo;
   m = nume;
   r = m % n;
   while (r != 0)
   {
       m = n;
       n = r;
       r = m % n;
   }
   if (n != 1)
   {
       nume /= n;
       demo /= n;
   }
   if (demo < 0)
   {
       nume = -nume;
       demo = -demo;
   }
}
istream& operator >> (istream& istr,Franction& x)
{//从键盘上输入一个规定格式的分数到x 中
   char ch;
   cout<<"Input a franction: "<<endl;
   istr>>x.nume>>ch>>x.demo;
   if (x.demo == 0)
   {
       cerr<<"分数的分母不能为0 "<<endl;
       exit(1);
   }
   return istr;
}
ostream& operator << (ostream& ostr,Franction& x)
{//按规定输出x中的分数
   ostr<<x.nume<<"/"<<x.demo<<endl;
   return ostr;
}



https://blog.sciencenet.cn/blog-3134052-1064540.html

上一篇:文件的内容的读取、查找、替换、输出等基本功能的实现
下一篇:生活中的一些小段子,搞笑的事实
收藏 IP: 124.207.244.*| 热度|

0

该博文允许注册用户评论 请点击登录 评论 (0 个评论)

数据加载中...
扫一扫,分享此博文

Archiver|手机版|科学网 ( 京ICP备07017567号-12 )

GMT+8, 2024-10-20 04:43

Powered by ScienceNet.cn

Copyright © 2007- 中国科学报社

返回顶部