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;
}
相关推荐
monkey_meng2 分钟前
【遵守孤儿规则的External trait pattern】
开发语言·后端·rust
一只小小汤圆6 分钟前
opencascade源码学习之BRepOffsetAPI包 -BRepOffsetAPI_DraftAngle
c++·学习·opencascade
legend_jz27 分钟前
【Linux】线程控制
linux·服务器·开发语言·c++·笔记·学习·学习方法
嘿BRE36 分钟前
【C++】几个基本容器的模拟实现(string,vector,list,stack,queue,priority_queue)
c++
tangliang_cn1 小时前
java入门 自定义springboot starter
java·开发语言·spring boot
程序猿阿伟1 小时前
《智能指针频繁创建销毁:程序性能的“隐形杀手”》
java·开发语言·前端
新知图书1 小时前
Rust编程与项目实战-模块std::thread(之一)
开发语言·后端·rust
威威猫的栗子1 小时前
Python Turtle召唤童年:喜羊羊与灰太狼之懒羊羊绘画
开发语言·python
力透键背1 小时前
display: none和visibility: hidden的区别
开发语言·前端·javascript
bluefox19791 小时前
使用 Oracle.DataAccess.Client 驱动 和 OleDB 调用Oracle 函数的区别
开发语言·c#