2024/4/26 C++day4

文章详细描述了如何在C++中,特别是在Complex和myString类中,实现各种运算符重载,包括算术运算、关系运算和逻辑运算,以及输入输出操作符的实现。
摘要由CSDN通过智能技术生成

1在Complex类的基础上,完成^,>>,<<,~运算符的重载

#include <iostream>
using namespace std;
class Complex
{
    int rel;    //实部
    int vir;    //虚部
public:
    Complex(){}
    Complex(int rel,int vir):rel(rel),vir(vir){}
    void show()
    {
        cout << this->rel << "+" << this->vir << "i" << endl;
    }
    friend Complex operator-(const Complex c1,const Complex c2);
    friend Complex operator/(const Complex c1,const Complex c2);
    friend bool operator==(const Complex c1,const Complex c2);
    friend Complex operator++(Complex &c1,int);
    friend ostream &operator<<(ostream &out,Complex c1);
    friend istream &operator>>(istream &in,Complex &c1);
    Complex operator~() const {  
       
          return Complex(-rel, -vir);  
      } 
    Complex operator^(const Complex& other) const {  
           // 实部相减,虚部相加  
           return Complex(rel - other.rel, vir + other.vir);  
       }  
    //成员函数版实现+运算符重载
    Complex operator+(const Complex c1);
    //成员函数版实现*运算符重载
    Complex operator*(const Complex c1);
    //成员函数版%运算符重载
    Complex operator%(const Complex c1);
    //         <<
    friend ostream &operator<<(ostream &out,Complex c1);
    //         >>
    friend istream &operator>>(istream &in,Complex c2);
    //成员函数版>运算符重载
    bool operator>(const Complex c1);
    bool operator!();
    //成员函数版的前自增运算重载,单目运算符,成员函数版运算符重载无需传参
    Complex operator++()
    {
        ++this->rel;
        ++this->vir;
        return *this;
    }
    //成员函数版()运算符的重载
    operator int()
    {
        return this->rel;
    }
//    operator double()
//    {
//        return 0.9;
//    }
//    operator char()
//    {
//        return 'a';
//    }
    
    //使用operator()实现仿函数的功能
    int operator()(int a,int b)
    {
        return  a>b?a:b;
    }
    void operator()()
    {
        cout << "这是一个仿函数" << endl;
    }
};
//成员函数版的!运算符重载
bool Complex::operator!()
{
    return !(this->rel||this->vir);
}
bool Complex::operator>(const Complex c1)
{
    return this->rel>c1.rel;
}
ostream &operator<<(ostream &out,Complex c1){
    out<<c1.rel<<"+"<<c1.vir<<"i"<<endl;
    return out;
}
istream &operator>>(istream &in,Complex c2){
    in>>c2.rel>>c2.vir;
    return in;
}
Complex Complex::operator%(const Complex c1)
{
    Complex temp;
    temp.rel = this->rel%c1.rel;
    temp.vir = this->vir%c1.vir;
    return temp;
}
Complex Complex::operator*(const Complex c1)
{
    Complex temp;
    temp.rel = this->rel*c1.rel;
    temp.vir = this->vir*c1.vir;
    return temp;
}
Complex Complex::operator+(const Complex c1)
{
    //实例化了一个temp类对象,并调用了有参构造
    //Complex temp(this->rel+c1.rel,this->vir+c1.vir);
    Complex temp;
    temp.rel = this->rel+c1.rel;
    temp.vir = this->vir+c1.vir;
    return temp;
}
//全局函数版本的-运算符重载
Complex operator-(const Complex c1,const Complex c2)
{
    //实例化一个类对象,用于返回运算后的结果
    Complex temp;
    temp.rel = c1.rel-c2.rel;
    temp.vir = c1.vir-c2.vir;
    return temp;
}
//全局函数版/运算符重载
Complex operator/(const Complex c1,const Complex c2)
{
    Complex temp;
    temp.rel = c1.rel/c2.rel;
    temp.vir = c1.vir/c2.vir;
    return temp;
}
//全局函数版本==运算符重载
bool operator==(const Complex c1,const Complex c2)
{
    return c1.rel==c2.rel&&c1.vir==c2.vir;
}
//全局函数版后自增运算符重载
Complex operator++(Complex &c1,int)
{
    Complex temp(c1.rel++,c1.vir++);
    return temp;
}
//全局函数版<<运算符重载,
//参数是ostream类对象的引用,返回值也是ostream类对象的引用
ostream &operator<<(ostream &out,Complex c1)
{
    out << c1.rel << "+" << c1.vir << "i" << endl;
    return out;
}
//全局函数版>>运算符重载,传类对象的引用,因为需要把输入保存在类对象中
istream &operator>>(istream &in,Complex &c1)
{
    in >> c1.rel >>c1.vir;
    return in;
}
  1. 在昨天作业myString类的基础上,完成+、关系运算符、逻辑运算符、输入输出运算符的重载

#include <iostream>
#include <cstring>
using namespace std;
class myString
{
    private:
        char *str;          //记录c风格的字符串
        int size;            //记录字符串的实际长度
    public:
        //运算符重载
        friend myString operator+(const myString s1,const myString s2);//+
        friend ostream &operator<<(ostream &out,myString s1);//左移
        friend istream &operator>>(istream &in,myString &s1);//右移
        //>、<、==、!=关系运算符重载
        friend bool operator>(const myString s1,const myString s2);
        friend bool operator<(const myString s1,const myString s2);
        friend bool operator==(const myString s1,const myString s2);
        friend bool operator!=(const myString s1,const myString s2);
        
        //无参构造
        myString() : str(new char[1]), size(0)
        {
            str[0] = '\0';
            //cout<<"无参构造"<<endl;
        }
        //有参构造
        myString(const char* s)
        {
            size = strlen(s);
            str = new char[size + 1];
            strcpy(str, s);
            //cout<<"有参构造"<<endl;
        }
        myString(string s1)
        {
            size = s1.size();
            str = new char[size + 1];
            strcpy(str, s1.c_str());
           // cout<<"有参构造"<<endl;
        }
        //拷贝构造
        myString(const myString &other)
        {
            size = other.size;
            str = new char[size + 1];
            strcpy(str, other.str);
            //cout<<"拷贝构造"<<endl;
        }
        //拷贝赋值函数
        myString& operator=(const myString &other)
        {
             if (this != &other) {
                 delete[] str;
                 size = other.size;
                 str = new char[size + 1];
                 strcpy(str, other.str);
                 //cout<<"拷贝赋值"<<endl;
             }
             return *this;
         }
        //析构函数
        ~myString()
        {
               delete[] str;
            //cout<<"析构"<<endl;
           }
        //判空函数
        bool empty()
        {
            return size==0;
 
        }
        //size函数
        void mysize()
        {
            cout<<"size = "<<size<<endl;
        }
        //c_str函数
        char* c_str()
        {
            return str;
        }
        //at函数
        char &at(int pos)
        {
            if (pos < 0 || pos >= size) {
                cout<<"位置不合法"<<endl;
            }
            return str[pos];
        }
    
};
//+
myString operator+(const myString s1,const myString s2)
{
    myString temp;
    temp.size = s1.size+s2.size;
    temp.str=strcpy(temp.str,strcat(s1.str,s2.str));
    return temp;
}

//左移运算符重载
ostream &operator<<(ostream &out,myString s1)
{
    out<< s1.str <<"  "<<s1.size;
    return cout;
}
//右移运算符重载
istream &operator>>(istream &in,myString &s1)
{
    string s;
    in>>s;
    s1.size = s.size();
    strcpy(s1.str, s.c_str());
 
    return cin;
}
bool operator>(const myString s1,const myString s2)
{
    string s3 =s1.str;
    string s4 =s2.str;
    return s3>s4;
}
bool operator<(const myString s1,const myString s2)
{
    string s3 =s1.str;
    string s4 =s2.str;
    return s3<s4;
}
bool operator==(const myString s1,const myString s2)
{
    string s3 =s1.str;
    string s4 =s2.str;
    return s3==s4;
}
bool operator!=(const myString s1,const myString s2)
{
    string s3 =s1.str;
    string s4 =s2.str;
    return s3!=s4;
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值