c++ — 运算符重载与strcmp自实现

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

using namespace std;

class myStrcmp
{
public:
    //在声明处默认参数
    myStrcmp(char *str=NULL);
    //析构器
    ~myStrcmp()
    {
        cout<<"caibi"<<endl;
        delete []str;
    }
    //运算符重载
    int operator > (myStrcmp &str2);
    int operator < (myStrcmp &str2);
    int operator = (myStrcmp &str2);
private:
    char *str;   //成员函数str存放字符串
};

//构造器
myStrcmp::myStrcmp(char *str)
{
    //如果没有值传进来,字符串置空
    if(str==NULL)
    {
        this->str =new char[1];
        *this->str='\0';
    }
    //如果有值传入,使用strcpy拷贝进对象的str中
    else
    {
        this->str =new char[strlen(str)+1]; //申请空间
        strcpy(this->str,str);
    }
}

//strcmp运算符重载与自实现
int myStrcmp::operator > (myStrcmp &str2)
{
    //字符比较,不等退出
    char *p=str2.str;    //临时指针变量p,合理调用析构器析构str2
    for(;*this->str == *p && *p!= '\0' && *this->str != '\0';(this->str)++,p++);

    //比较退出时第一个字符大小
    if(*this->str > *p)
    return 1;
}

int myStrcmp::operator < (myStrcmp &str2)
{
    //字符比较,不等退出
    char *p=str2.str;     //临时指针变量p
    for(;*this->str == *p && *p != '\0' && *this->str != '\0';(this->str)++,p++);

    //比较退出时第一个字符大小
    if(*this->str < *p)
    return -1;
}

int myStrcmp::operator = (myStrcmp &str2)
{

    //字符比较,不等退出
    char *p=str2.str;   //临时指针变量p
    for(;*this->str == *p && *p != '\0' && *this->str != '\0';(this->str)++,p++);

    //比较退出时第一个字符大小
    if((*this->str) == (*p))
    return 0;
}

int main()
{
    myStrcmp str1("panda");  //字符串s1
    myStrcmp str2("panmsa");  //字符串s2

    //判断str1与str2大小
    if(str1>str2==1)
        cout<<"str1>str2"<<endl;
    else if(str1<str2==-1)
        cout<<"str1<str2"<<endl;
    else if((str1=str2)==0)
        cout<<"str1=str2"<<endl;

	system("pause");
    return 0;
}

  总结:析构器在析构时,若未定义str2的临时指针变量,str2会析构错误;不要改变指针位置,使用下标进行比较

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

using namespace std;

class myStrcmp
{
public:
    //在声明处默认参数
    myStrcmp(char *str=NULL);
    //析构器
    ~myStrcmp()
    {
        cout<<"caibi"<<endl;
        delete []str;
    }
    //运算符重载
    int operator > (myStrcmp &str2);
    int operator < (myStrcmp &str2);
    int operator = (myStrcmp &str2);
private:
    char *str;   //成员函数str存放字符串
};

//构造器
myStrcmp::myStrcmp(char *str)
{
    //如果没有值传进来,字符串置空
    if(str==NULL)
    {
        this->str =new char[1];
        *this->str='\0';
    }
    //如果有值传入,使用strcpy拷贝进对象的str中
    else
    {
        this->str =new char[strlen(str)+1]; //申请空间
        strcpy(this->str,str);
    }
}

//strcmp运算符重载与自实现
int myStrcmp::operator > (myStrcmp &str2)
{
    //字符比较,不等退出
    int i=0;
	for(;this->str[i] == str2.str[i] && str2.str[i]!= '\0' && this->str[i] != '\0';i++);

    //比较退出时第一个字符大小
    if(this->str[i] > str2.str[i])
    return 1;
}

int myStrcmp::operator < (myStrcmp &str2)
{
  //字符比较,不等退出
    int i=0;
	for(;this->str[i] == str2.str[i] && str2.str[i]!= '\0' && this->str[i] != '\0';i++);

    //比较退出时第一个字符大小
    if(this->str[i] < str2.str[i])
    return -1;
}

int myStrcmp::operator = (myStrcmp &str2)
{

    //字符比较,不等退出
    int i=0;
	for(;this->str[i] == str2.str[i] && str2.str[i]!= '\0' && this->str[i] != '\0';i++);

    //比较退出时第一个字符大小
    if((this->str[i]) == (str2.str[i]))
    return 0;
}

int main()
{
    myStrcmp str1("panda");  //字符串s1
    myStrcmp str2("pandaa");  //字符串s2

    //判断str1与str2大小
    if(str1>str2==1)
        cout<<"str1>str2"<<endl;
    else if(str1<str2==-1)
        cout<<"str1<str2"<<endl;
    else if((str1=str2)==0)
        cout<<"str1=str2"<<endl;

	system("pause");
    return 0;
}

  

 

转载于:https://www.cnblogs.com/huxiaobai/p/10595902.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,下面是一个简单的字符串类的实现,包括了+、+=和>运算符的重载。请参考下面的代码: ```c++ #include <iostream> #include <cstring> using namespace std; class String { public: String() : data(nullptr), length(0) {} String(const char* str) { length = strlen(str); data = new char[length + 1]; strcpy(data, str); } String(const String& other) { length = other.length; data = new char[length + 1]; strcpy(data, other.data); } ~String() { if (data) { delete[] data; data = nullptr; } } String& operator=(const String& other) { if (this != &other) { if (data) { delete[] data; data = nullptr; } length = other.length; data = new char[length + 1]; strcpy(data, other.data); } return *this; } String operator+(const String& other) const { String result; result.length = length + other.length; result.data = new char[result.length + 1]; strcpy(result.data, data); strcat(result.data, other.data); return result; } String& operator+=(const String& other) { char* temp = new char[length + 1]; strcpy(temp, data); if (data) { delete[] data; data = nullptr; } length += other.length; data = new char[length + 1]; strcpy(data, temp); strcat(data, other.data); delete[] temp; return *this; } bool operator>(const String& other) const { return strcmp(data, other.data) > 0; } friend ostream& operator<<(ostream& os, const String& str) { return os << str.data; } private: char* data; int length; }; ``` 这个字符串类包含了默认构造函数、带一个参数的构造函数(用于从C风格字符串创建字符串对象)、拷贝构造函数、析构函数、赋值运算符重载、+运算符重载、+=运算符重载和>运算符重载。其中,+和+=运算符都返回了一个新的字符串对象。 你可以在自己的代码中使用这个字符串类,并根据需要重载其他运算符。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值