C++(三)——运算符重载

运算符重载

重定义或重载大部分 C++ 内置的运算符就能使用自定义类型的运算符。

重载的运算符是带有特殊名称的函数,函数名是由关键字 operator 和其后要重载的运算符符号构成的。与其他函数一样,重载运算符有一个返回类型和一个参数列表。

不能为了重载而重载     重载之后的运算符和原来的使用方式特性一模一样

可重载的运算符列表

双目算术运算符	+ (加),-(减),*(乘),/(除),% (取模)

关系运算符	==(等于),!= (不等于),< (小于),> (大于),<=(小于等于),>=(大于等于)

逻辑运算符	||(逻辑或),&&(逻辑与),!(逻辑非)

单目运算符	+ (正),-(负),*(指针),&(取地址)

自增自减运算符	++(自增),--(自减)

位运算符	| (按位或),& (按位与),~(按位取反),^(按位异或),,<< (左移),>>(右移)

赋值运算符	=, +=, -=, *=, /= , % = , &=, |=, ^=, <<=, >>=

空间申请与释放	new, delete, new[ ] , delete[]

其他运算符	()(函数调用),->(成员访问),,(逗号),[](下标)


不可重载的运算符列表

.              :成员访问运算符
->           :成员指针访问运算符
::            :域运算符
sizeof    :长度运算符
?:          :条件运算符
#           : 预处理符号

+ - 两个运算符的重载

#include <iostream>

using namespace std;

class dog 
{

    private:
        int weight ;
        string name;
    public:

        //构造函数
        dog(string name , int weight)
        {
            this->name = name ;
            this->weight = weight ;
        }

        //拷贝构造
        dog(const dog & obj)
        {
            this->name = obj.name;
            this->weight = obj.weight;

        }

        //移动
        dog(const dog && obj)
        {
            this->name = obj.name;
            this->weight = obj.weight;
        }

        //析够函数
        ~dog()
        {

        }

        //+两只狗体重之和
        dog & operator +(const dog & obj )
        {
            static dog temp(" ",1);
            temp.weight = this->weight + obj.weight;
            temp.name = this->name + "和" + obj.name;

            return temp;
        }

        //-两只狗体重之差
        dog & operator -(const dog & obj )
        {
            static dog temp(" ",1);
            temp.weight = this->weight - obj.weight;
            temp.name = this->name + "和" + obj.name+"体重相差";

            return temp;
        }

        friend ostream & operator <<(ostream & os , dog & obj );


};

//输出<<重载
ostream & operator <<(ostream & os , dog & obj )
{
    os<<"名字:"<<obj.name<<endl<<"体重:"<<obj.weight<<endl;
    return os;
}

int main()
{
    dog g1("土狗🐶",25);
    dog g2("小狗🐶",26);
    cout<<g1<<g2;

    
    cout<<g1+g2;
    
    cout<<g2-g1;

    return 0;
}

运行结果:
在这里插入图片描述


其他运算符实例代码

#include <iostream>
#include <cstring>


using namespace std;

class Arr
{
    private:
        char * arr;
        int len ;
        int size;

    public:
        //构造
        Arr(char * str)
        {
            len = strlen(str);
            size = len+1;
            arr = new char[size];
            strcpy(arr,str);
        }
        
        //拷贝构造🐶
        Arr(Arr & obj)
        {
        	arr = new char[obj.size];
            len = obj.len;
            size = obj.size;
            strcpy(arr,obj.arr);
        }

        //🐣移动构造🐶
        Arr(Arr && obj )
        {
            len = obj.len;
            size = obj.size;
            arr = obj.arr;
            obj.arr = nullptr;
        }
        
        //+=重载:两个字符串连接
        Arr & operator +=(const Arr &obj)
        {
            if(obj.len + this->len > this->size )
            {
                char * p = new char[obj.len+len+1];
                strcpy(p,arr);
                delete []arr;
                arr = p ;
                p = nullptr;
                size = obj.len+len+1;
            }
            strcat(arr,obj.arr);
            len = len + obj.len ;
            return *this;
        }

        //= 实现字符串复制功能🐮
        Arr & operator =(const Arr &obj)
        {
            if(obj.len > size )
            {
                char *p = new char[obj.size];
                strcpy(p,obj.arr);
                arr = p ;
                p = nullptr;
                size = obj.size;
            }
            else
            {
                strcpy(this->arr,obj.arr);
            }
            len = obj.len;

            return *this;
        }

        //[] 🏇
        char & operator [](const int i )
        {   
            return arr[i];
        }

        //()🦆
        void operator ()()
        {
            cout<<"hello new ()"<<endl;
        }

        friend ostream & operator <<(ostream & os , const Arr & obj);
        friend istream & operator >>(istream & is , const Arr & obj );


};
        

ostream & operator <<(ostream & os , const Arr & obj)
{
    os<<"data:"<<obj.arr<<endl<<"len ="<<obj.len<<endl<<endl<<"size="<<obj.size<<endl;
    return os;

}

istream & operator >>(istream & is , const Arr & obj )
{
    is>>obj.arr;

    return is;
}
int main()
{
    char buf[] = {"n牛🐮"};
    char buf1[] = {"m马🏇"};
    
    Arr a = buf;
    Arr b = buf1;

    cout<<a<<endl;
    a +=b;
    cout<<a<<endl;

    a=b;
    cout<<a<<endl;

    a[0]= 't';
    cout<<a<<endl;
    
    a();
    
    cin>>a;
    cout<<a<<endl;


}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值