首页 > 其他分享 >友元函数与运算符重载

友元函数与运算符重载

时间:2024-01-11 22:33:21浏览次数:25  
标签:友元 hours const sum MyTime 运算符 重载 minutes

友元函数

友元函数是指某些虽然不是类成员却能够访问类的所有成员的函数。类授予它的友元特别的访问权。通常同一个开发者会出于技术和非技术的原因,控制类的友元和成员函数(否则当你想更新你的类时,还要征得其它部分的拥有者的同意)。友元函数是一个不属于类成员的函数,但它可以访问该类的私有成员。换句话说,友元函数被视为好像是该类的一个成员。友元函数可以是常规的独立函数,也可以是其他类的成员。实际上,整个类都可以声明为另一个类的友元。
为了使一个函数或类成为另一个类的友元,必须由授予它访问权限的类来声明。类保留了它们的朋友的 "名单",只有名字出现在列表中的外部函数或类才被授予访问权限。通过将关键字 friend 放置在函数的原型之前,即可将函数声明为友元。

#include <iostream>
using namespace std;
class MyTime{
    private:
        int hours;
        int minutes;
    public:
        MyTime(): hours(0), minutes(0){}
        MyTime(int h, int m): hours(h), minutes(m){}
        MyTime operator+(const MyTime & t) const{
            MyTime sum;
            sum.minutes = this->minutes + t.minutes;
            sum.hours = this->hours + t.hours;
            sum.hours += sum.hours / 60;
            sum.minutes %= 60;
            return sum;
        }
        MyTime & operator+=(const MyTime & t){
            this->minutes += t.minutes;
            this->hours += t.hours;
            this->minutes %= 60;
            this->hours = this-> hours /60;
            return *this;
        }
        MyTime operator+(int m) const{
            MyTime sum;
            sum.minutes = this->minutes + m;
            sum.hours = this->hours;
            sum.hours += sum.minutes / 60;
            sum.minutes %= 60;
            return sum;
        }
        friend MyTime operator+(int m, MyTime t){
            return t + m;
        }
        string getTime() const {
            return std::to_string(this->hours) + " hours and " 
                + std::to_string(this->minutes) + " minutes.";
        }
        // 利用友元函数重载<<输出流,
        // 此处注意返回值类型ostream为了return_value(cout) << endl;
        // 输出符能继续连起来(否则可能变成0<<endl;)
        friend ostream & operator<<(ostream & os, const MyTime & t){
            string str = to_string(t.hours) + " h " + to_string(t.minutes) + "m.";
            os<<str;
            return os;
        }
        // 重载输入流
        friend istream & operator>>(istream & is, MyTime & t){
            is >> t.hours >> t.minutes;
            t.hours += t.minutes / 60;
            t.minutes %= 60;
            return is;
        }
};
int main(){

    MyTime t1(2, 40);
    cout<<(20+ t1).getTime()<<endl; // 使用友元函数
    cout<<(t1+20).getTime()<<endl;

    // 输出符从左往右运算
    cout<<(t1 + 10)<<endl;

    cin>> t1;
    cout<<t1<<endl;
    return 0;
}

运算符重载


#include <iostream>
using namespace std;

class MyTime{
    private:
        int hours;
        int minutes;
    public:
        MyTime(): hours(0), minutes(0){}
        MyTime(int h, int m): hours(h), minutes(m){}
        MyTime operator+(const MyTime &t) const{
            MyTime sum;
            sum.minutes = this->minutes + t.minutes;
            sum.hours = this->hours + t.hours;
            sum.hours += sum.minutes / 60;
            sum.minutes %= 60;
            return sum;
        }

        MyTime & operator+=(const MyTime &t){
            this->minutes += t.minutes;
            this->hours += t.hours;
            return *this;
        }

        MyTime & operator+(const string str) const{
            MyTime sum = *this;
            if(str == "1h"){
                sum.hours = this->hours + 1;
            }
            return sum;
        }
        void getTime() const{
            cout<< this->hours <<" : " << this->minutes << endl;    
        }

};
int main(){
    MyTime t1 = MyTime(1, 20);
    MyTime t2 = MyTime(2, 40);
    MyTime tsum = t1 + t2;
    tsum.getTime();
    //MyTime t3 = tsum + "1h";
    //t3.getTime();
    (tsum + "1h").getTime();
    return 0;
}

标签:友元,hours,const,sum,MyTime,运算符,重载,minutes
From: https://www.cnblogs.com/bai7/p/17959672

相关文章

  • python里面什么是身份运算符
    Python中的身份运算符是一种用于比较对象是否具有相同的内存地址的运算符。在Python中,身份运算符由is和isnot两个关键字组成。本文将详细介绍Python中的身份运算符及其使用方式。is关键字在Python中,is是一个用于比较两个对象是否具有相同内存地址的关键字。当is运算符用于比较两个......
  • 运算符和流程控制
    5.运算符:在Java中,运算符用于执行各种操作,例如算术运算、关系运算和逻辑运算。让我们一步步学习这些运算符的用法。步骤5.1:算术运算符算术运算符用于执行基本的数学运算。以下是一些常见的算术运算符:inta=5;intb=2;intsum=a+b;//加法intdifference=a-b;//......
  • python学习笔记7(不同进制之间的转换、算术运算符、赋值运算符、比较运算符、逻缉运算
    一)不同进制之间的转换二进制:0B或0b开头八进制:0o或0O开头十六进制:0x或0X开头(二)算术运算符//整除幂运算print(23)算术运算符优先级1、**2、*,/,%,//3、+,-(三)赋值运算符+=、-=、*=、/=、%=、**=、//=python支持链式赋值a=b=c=100python支持系列解包赋值a,b=10,20python中的值交换b,a=......
  • 运算符2
    自增自减赋值运算符关系运算符逻辑运算符短路运算符三元运算符......
  • 运算符
    强制转换数据会出错,byte在-128~127<200......
  • JAVA方法重载(函数)
    [JAVA方法]方法重载重载指的是多个方法名称相同,但参数列表不同参数列表不同分为:参数个数不同参数类型不同参数的多类型顺序不同注意事项一个表达式中的最后结果以数据类型范围大的为结果的数据类型。无法因为返回值类型不同进行重载。参数传递对于引用类......
  • 逻辑运算符
    '''逻辑运算符:用于链接多个比较运算符and:表示并且(与)or:表示或者(或),只要出现一个True就为Truenot:表示取反(非),如果是True则取反,如果是False则取反'''#and(与)print(20==20and30==30)print(20==10and30==30)print(20==20and30==40)print(20==10and30==40)#or(或)print(2......
  • 【C++】STL 容器 - set 集合容器 ⑤ ( 仿函数 functor 简介 | 仿函数 functor 调用 |
    文章目录一、仿函数functor1、仿函数functor简介2、仿函数functor调用3、代码示例-仿函数functor调用二、为自定义类元素设置排序规则-仿函数functor1、自定义类排序规则2、仿函数-实现自定义类排序规则3、重载<运算符函数-实现自定义类排序规则一、仿函数fu......
  • 重载输入输出运算符<< 学习
    转自:https://developer.aliyun.com/article/297612,https://blog.csdn.net/My_heart_/article/details/515346241.介绍cin和cout分别是istream类和ostream类的对象,在类库提供的头文件中已经对这两个类的“<<”和“>>”进行了重载。若自定义的类要使用<</>>作为输入或输出,需要重......
  • C++入门-命名空间、引用、函数重载
    引言:C++是C的一个超集,即C++继承了C语言的全部特性。C++不仅包含了C的关键字、语法和语义,还增加了一些新的特性。例如命名空间、引用、函数重载等,本片博客旨在向大家分享C++相较于C语言,增加的一些新的特性。1.命名空间namespace我们知道,在C语言中编写程序时,有时会存在标识符名与标准......