c++中常见运算符重载代码

论坛 期权论坛 脚本     
匿名技术用户   2020-12-28 13:40   11   0

c语言中,运算符的操作数只支持基本数据类型,而c++中操作数可以扩展支持复合数据类型,这就要通过运算符重载来实现。我们可以把运算符看作一个函数名,通过函数重载的方式为同一个运算符实现不同规则的运算,所以运算符重载的本质就是函数重载。运算符重载和普通函数重载的唯一区别就是函数名,运算符重载的函数名是由关键字operator和其后要重载的运算符符号构成的,在形式上比普通函数名复杂一些。

下面是一些具体代码。通过运算符重载,实现类的对象之间直接赋值,相加,比较大小等。


头文件string.h

#ifndef _MYSTRING_H
#define _MYSTRING_H

#include <iostream>

using namespace std;

class String
{
     //重载<< >>  注意插入提取运算符只能重载为友元函数
    friend ostream &operator <<(ostream &out, const String &s);
    friend istream &operator >>(istream &in, String &s);
private:
    int m_length;
    char *m_data;
public:
    String();
    String(char *s);
    String(const String &s);
    String(int a,char ch);
    ~String();

    //重载=  [ ] 
    String &operator = (char *str);
    String &operator = (const String &s);
    
    char operator [](int index);

    //重载+  +=
    String &operator +(const String &s);
    String &operator +(char *str);
    String &operator +=(const String &s);
    String &operator +=(char *str);

    //重载==   !=
    bool operator ==(char *str);
    bool operator ==(const String &s);
    bool operator !=(char *str);
    bool operator !=(const String &s);
    
    //重载> <
    bool operator >(char *str);
    bool operator >(const String &s);
    bool operator <(char *str);
    bool operator <(const String &s);
};

#endif


string.cpp

#include "string.h"
#include <cstring>
#include <iostream>

using namespace std;

String::String()
{
    m_length = 0;
    m_data = NULL;
}

String::String(char *s)
{
    m_length = strlen(s);
    m_data = new char [m_length + 1];
    strcpy(m_data,s);
    m_data[m_length] = '\0';
}
String::String(const String &s)
{
    m_length =s.m_length;
    m_data = new char [m_length +1];
    strcpy(m_data, s.m_data);
    m_data[m_length] = '\0';
}
String::String(int a, char ch)
{
    m_length = a;
    m_data = new char [m_length + 1];
    for(int i = 0; i < m_length; i++)
    {
        m_data[i] = ch;
    }
    m_data[m_length] = '\0';
}
String::~String()
{
    if(m_data != NULL)
    {
       delete []m_data;
       m_data = NULL;
    }
}
ostream &operator <<(ostream &out, const String &s)
{
    out<<s.m_data;
    return out;
}
istream &operator >>(istream &in, String &s)
{
    char tmp[100] = {0};

    in>>tmp;
   
    s.m_length = strlen(tmp);
    s.m_data = new char [s.m_length + 1];
    strcpy(s.m_data, tmp);
    s.m_data[s.m_length] = '\0';

    return in;
}

String &String::operator =(char *str)
{
    m_length = strlen(str);
    if(m_data != NULL)
    {
        delete []m_data;
    }
    m_data = new char [m_length + 1];
    strcpy(m_data, str);
    m_data[m_length] = '\0';
   
    return *this;
}
String &String ::operator =(const String &s)
{
    m_length = s.m_length;
    if(m_data != NULL)
    {
        delete []m_data;
    }
    m_data = new char [m_length + 1];
    strcpy(m_data, s.m_data);
    m_data[m_length] = '\0';
  
    return *this;
}
char String::operator [](int index)
{
    return m_data[index];
}

String &String::operator +(char *str)
{
    char *tmp = m_data;
    m_length = m_length + strlen(str);
    m_data = new char [m_length + 1];
    strcpy(m_data, tmp);
    strcat(m_data, str);
    delete []tmp;

    return *this;
}
String &String::operator +(const String &s)
{
    char *tmp = m_data;
    m_length = m_length + s.m_length;
    m_data = new char [m_length + 1];
    strcpy(m_data, tmp);
    strcat(m_data, s.m_data);
    delete []tmp;
    
    return *this;
} 
bool String:: operator ==(char *str)
{
    if(!strcmp(m_data, str) )
    {
        return true;
    }
    else
    {
        return false;
    }
}
bool String::operator == (const String &s)
{
    if(!strcmp(m_data, s.m_data))
    {
        return true;
    }
    else
    {
        return false;
    }
}
bool String::operator >(char *str)
{
    int i = 0;
    for(i = 0; i < m_length; i++)
    {
        if(m_data[i] > str[i])
        {
            return true;
 }
        break;
    }
    return false;   
}
bool String::operator >(const String &s)
{
    for(int i = 0; i < m_length; i++)
    {
        if(m_data[i] > s.m_data[i])
        { 
     return true;
 }
        break;
    }
     return false;
}

主函数mainstring.cpp

#include "string.h"
#include <iostream>

using namespace std;

int main()
{
    String s1;
    String s2("wiww");
    String s3(s2);
    String s4(10,'s');

  /*  cout<<s2<<endl;
    cout<<s3<<endl;
    cout<<s4<<endl;

    cin>>s1;
    cout<<s1<<endl;

    s2 = s1;
    cout<<s2<<endl;
    cout<<s2[0]<<endl;

    s1 = s2 + "wwwww";
    cout<<s1<<endl;
    s1 = s2 + s3;
    cout<<s1<<endl;


    if(s2 == "hello")
    {
        cout<<"Equal"<<endl;
    }
    else
    {
        cout<<"Not Equal"<<endl;
    }
    if(s2 == s3)
    {
        cout<<"Equal"<<endl;
    }
    else
    {
        cout<<"Not Equal"<<endl;
    }*/
    if(s2 > "sad")
    {
        cout<<">"<<endl;
    }
    else
    {
        cout<<"<="<<endl;
    }
    if(s2 > s3)
    {
        cout<<">"<<endl;
    }
    else
    {
        cout<<"<="<<endl;
    }


    return 0;
}


分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:7942463
帖子:1588486
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP