运算符重载,友元函数;

运算符重载

#include<iostream>

using namespace std;
class CInt
{
friend ostream& operator<<(ostream& out,const CInt & timp);
private:
    int i;
public:
    CInt (int d)
    {
        i=d;
    };
    CInt(const CInt &timp)
    {
        i=timp.i;
    }
public:
    CInt operator+(const CInt &timp)const //CInt add(const CInt &timp)const
    {
        return(i+timp.i);
    }
    CInt add(const CInt &timp)const
    {
        return(i+timp.i);
    }
    CInt operator+(const int d) const
    {
        return(i+d);
    }
/**public:
    CInt operator*(const CInt &timp);
    CInt operator+=(const CInt &timp);
    CInt operator&(const CInt &timp);
    CInt operator>(const CInt &timp);
    CInt operator%(const CInt &timp);
    //等等。。。。。可以重载各种符号;
    //但是对 ? . .* :: sizeof 这五个运算符不能重载
**/
public:
    CInt& operator++()//返回this所以可以引用返回
    {
        i++;
        return *this;
    }
    CInt operator++(int )//不能理解,就当做规定吧,区分前加加,和后加加
    {
        CInt timp(i);
        i++;         //给i++,但是下一步返回原来的那个,就达成了先使用后加加的效果;
        return timp;
    }

};

ostream& operator<<(ostream& out,const CInt & timp)
{
    out <<"这是一个整型"<<timp.i<<endl;
    return out;
}
int main()
{
    CInt a(2);
    CInt b=3;

    a=a+b;              //左边是调用函数的类,右边是函数的参数
    cout <<a;
    a=a.operator+(b);  //加号重载函数调用的本质(opertor+相当与一个正常的函数名)
    a=a.add(b);         //和一个普通函数类比,发现其实原理都一样

    cout <<a;
    cout <<a++;
    cout <<++a;

    a=a+10;//将10通过构造函数,构造为一个无名临时对象,然后执行对象的加法函数;


    cout<<a;
    //只靠函数的重载还有许多的东西无法实现,要通过友元函数
    //比如上面的输出符号的重载
    //还有,如果我有一个数字加一个对象,就不能 数字+对象,因为重载符号左面是调用他的对象
    //所以要实现他们就要借助友元函数
}

友元函数

#include <iostream>

using namespace std;
/**
成员函数
1.可以访问对象的私有部分;
2.函数必须位于类里面声明,作用域必须在类里面
3.调用函数时,必须由对象去调用

友元函数
1.可以访问对象的私有部分;
2.作用域取决于函数自己;
3.不需要该对象调用;

其实就是一个正常的函数,他不属于类A,但是只要声明为类A的友元函数,他就可以直接访问类A的私有成员,其他的就和该函数的原来的性质一样的;
**/
class CBool
{
    bool i;
public :
    CBool add()
    {
        return *this;
    }
};
class CInt
{
friend CBool;//CBool作为CInt的友元类,那么CBool里面的每个函数,都是CInt的友元函数,即CBool的函数可以访问CInt的私有部分;
private:
    int i;

friend void show (const CInt &timp);
/**
在类里面声明一个友元函数
友元函数不区分私有公有;
也可以讲函数定义也写在这里,但是他的作用域不是这个类这个一定要区分;
**/
//可以用友元函数补充运算符完不成的任务
friend ostream & operator<<(ostream &out,const CInt & timp);//将输符号重定义,并把他作为友元函数;
friend CInt operator+(const int &b,const CInt &timp);//实现一个整形加对象;
public :
    CInt(int d=0)
    {
        i=d;
    }
    CInt(const CInt & timp)
    {
        i=timp.i;
    }
public:
    ostream &operator<<(ostream &out )//如果我们把<<重载为成员函数
    {
        out<<"这是一个整数"<<i<<endl;
        return out ;
    }

};
void show (const CInt & timp)
{
    cout<<timp.i<<endl;
}
ostream &operator<<(ostream &out ,const CInt & timp)//重载<<,也可以重载>>.
{
    out<<"这是一个整数"<<timp.i<<endl;
    return out ;
}
CInt operator+(const int &b,const CInt &timp)
{
    return b+timp.i;
}
int main()
{
    CInt a=2;
    a=4+a;/**
    operator+(4,a);
    区别与成员函数的重载
    a=a+4; ==> a.operator+(4);  ==>operator+(this,4);
    **/
    cout << a << endl;//重载为友元函数调用
    a<<cout;//重载为成员函数,由a.operator+(cout);
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值