C++ 实现运算符重载

代码:

cpp 复制代码
#include <iostream>
#include <cstring>
 
using namespace std;
 
class myString
{
private:
    char *str;          //记录c风格的字符串
    int size;            //记录字符串的实际长度
public:
    
    //无参构造
    myString():size(10)
    {
        str = new char[size];         //构造出一个长度为10的字符串
        strcpy(str,"");         //赋值为空串
    }
 
    //有参构造
    myString(const char *s)          //string  s("hello world")
    {
        size = strlen(s)+1;
        str = new char[size];
        strcpy(str, s);
    }
 
    //拷贝构造
    myString(char *s,int i):str(new char(*s)),size(i){
        strcpy(this->str,s);
        this->size = i;
        cout<<"拷贝构造函数"<<endl;
    }
 
  //析构函数
    ~myString(){
        delete str;
    }
  
    //拷贝赋值函数
    myString &operator = (const myString &other){
        if(&other != this){
            this->str = new char[size];
            memset(str,0,size);
            strcpy(str,other.str);
        }
        return *this;
    }
 
  //判空函数
    bool empty(){
        if(strlen(str) == 0)
            return false;
        else
            return true;
    }
 
  //size函数
    int mysize(){
        return size;
    }
 
  //c_str函数
    const char* c_str(){
        return str;
    }
 
  //at函数
    char &at(int pos){
        if(pos>=size || pos<0){
            cout<<"访问越界"<<endl;
        }
        return str[pos];
    }
 
  //加号运算符重载
    const myString operator+(const myString &s)const{
       myString m;
       strcpy(m.str,this->str);
       strcat(m.str,s.str);
       m.size = strlen(m.str);
       return m;
    }
 
  //加等于运算符重载
    const myString operator+=(const myString &s){
        strcat(this->str,s.str);
        this->size = strlen(this->str);
        return *this;
    }
 
  //关系运算符重载(>)
    bool operator >(const myString &s)const{
        if(this->size < s.size){
            return false;
        }
        else{
            for(int i=0;i<this->size;i++){
                if(*(this->str+i)<*(s.str+i)){
                    return false;
                }
            }
        }
        return true;
    }
 
  //中括号运算符重载
    char & operator[](const int pos)const{
        if(pos>=size || pos<0){
            cout<<"访问越界"<<endl;
        }
        return *(str+pos);
    }
};
 
 
int main(){
 
    //展示字符串
    myString s1("ssssyyyy");
    myString s2("wwwwhhhh");
    cout<<s1.c_str()<<"     "<<s2.c_str()<<endl;
 
    //重载加法运算符
    myString s3;
    cout<<s3.mysize()<<endl;
    s3=s1+s2;
    cout<<s3.c_str()<<endl;
 
    //at运算
    cout<<s3.at(3)<<endl;
 
    //加等于
    s3+=s1;
    cout<<s3.c_str()<<endl;
    cout<<s3.mysize()<<endl;
 
    //关系运算
    if(s3>s1){
        cout<<"s3>s1"<<endl;
    }
    else
        cout<<"s3<s1"<<endl;
 
    //中括号
    cout<<s2[3]<<"     "<<s2[6]<< "     "<<s2[8]<<endl;
 
 
 
    return 0;
}
相关推荐
Marye_爱吃樱桃几秒前
MATLAB R2024b的安装、简单设置——保姆级教程
开发语言·matlab
旺仔.291几秒前
Linux系统基础详解(二)
linux·开发语言·网络
阿贵---几秒前
分布式系统C++实现
开发语言·c++·算法
不染尘.2 分钟前
最短路径之Bellman-Ford算法
开发语言·数据结构·c++·算法·图论
格林威2 分钟前
工业相机图像采集:Grab Timeout 设置建议——拒绝“假死”与“丢帧”的黄金法则
开发语言·人工智能·数码相机·计算机视觉·c#·机器视觉·工业相机
Reisentyan2 分钟前
[Refactor]CPP Learn Data Day 1
c++·重构
xiaoye-duck4 分钟前
C++ STL set 系列深度解析:从底层原理、核心接口到实战场景
开发语言·c++·stl
小涛不学习5 分钟前
Java高频面试题(带答案版)
java·开发语言
m0_662577977 分钟前
C++中的RAII技术深入
开发语言·c++·算法
旖-旎7 分钟前
二分查找(点名)(8)
c++·算法·二分查找·力扣