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;
}
相关推荐
DARLING Zero two♡19 分钟前
关于我、重生到500年前凭借C语言改变世界科技vlog.16——万字详解指针概念及技巧
c语言·开发语言·科技
7年老菜鸡20 分钟前
策略模式(C++)三分钟读懂
c++·qt·策略模式
Gu Gu Study21 分钟前
【用Java学习数据结构系列】泛型上界与通配符上界
java·开发语言
Ni-Guvara29 分钟前
函数对象笔记
c++·算法
似霰33 分钟前
安卓智能指针sp、wp、RefBase浅析
android·c++·binder
芊寻(嵌入式)43 分钟前
C转C++学习笔记--基础知识摘录总结
开发语言·c++·笔记·学习
獨枭1 小时前
C++ 项目中使用 .dll 和 .def 文件的操作指南
c++
霁月风1 小时前
设计模式——观察者模式
c++·观察者模式·设计模式
橘色的喵1 小时前
C++编程:避免因编译优化引发的多线程死锁问题
c++·多线程·memory·死锁·内存屏障·内存栅栏·memory barrier
一颗松鼠1 小时前
JavaScript 闭包是什么?简单到看完就理解!
开发语言·前端·javascript·ecmascript