#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;
}

  

c++ — 运算符重载与strcmp自实现的更多相关文章

  1. C++程序设计方法3:数组下标运算符重载

    数组下标运算符重载 函数声明形式 返回类型operator[](参数): 如果返回类型是引用,则数组运算符调用可以出现在等式的左边,接受赋值,即: Obj[index] = value; 如果返回类型 ...

  2. 编码实现字符串类CNString实现运算符重载

    题目描述: 编码实现字符串类CNString,该类有默认构造函数.类的拷贝函数.类的析构函数及运算符重载,需实现以下"="运算符."+"运算."[]& ...

  3. String 类实现 以及>> <<流插入/流提取运算符重载

    简单版的String类,旨在说明>> <<重载 #include <iostream> //#include <cstring>//包含char*的字符 ...

  4. c++知识点总结--友元&运算符重载

    友元函数(不属于类) 可以访问类的私有变量,以及私有函数 友元函数在类内声明需要friend关键字,类外定义就不需要 友元函数可以直接在类内定义 友元函数必须包含对象指针   友元类(不适用继承,只适 ...

  5. C++编写字符串类CNString,该类有默认构造函数、类的拷贝函数、类的析构函数及运算符重载

    编码实现字符串类CNString,该类有默认构造函数.类的拷贝函数.类的析构函数及运算符重载,需实现以下“=”运算符.“+”运算.“[]”运算符.“<”运算符及“>”运算符及“==”运算符 ...

  6. string类中运算符重载实现

    C++中预定义的加.减等运算符的操作对象只能是基本的数据类型.如果要在用户自定义的类型对象上应用同样的运算符,就需要通过运算符重载来重新定义其实现,使它能够用于自定义类型执行特定的操作,所以运算符重载 ...

  7. 五、C++运算符重载,使面向对象编程更方便

    复数类CComplex 编译器做对象运算的时候,会调用对象的运算符重载函数(优先调用成员方法):如果没有成员方法,就砸全局作用域找合适的运算符重载函数 ++和--运算符是单目运算符,在参数列表里放上一 ...

  8. 深入C++05:运算符重载

    运算符重载 1.复数类 运算符重载目的:使对象运算表现得和编译器内置类型一样: 复数类例子 #include<iostream> using namespace std; class CC ...

  9. C++ 运算符重载时,将运算符两边对象交换问题.

    在C++进行运算符重载时, 一般来讲,运算符两边的对象的顺序是不能交换的. 比如下面的例子: #include <iostream> using namespace std; class ...

随机推荐

  1. Matlab内嵌图像

    在数值分析中我们通常需要将数据可视化成图像的形式作为我们分析结果的有效性的途径,常用的画图函数有:$\tt plot$,$\tt surf$,$\tt mesh$...当然,我们有时需要多窗口显示图像 ...

  2. LARS 最小角回归算法简介

    最近开始看Elements of Statistical Learning, 今天的内容是线性模型(第三章..这本书东西非常多,不知道何年何月才能读完了),主要是在看变量选择.感觉变量选择这一块领域非 ...

  3. centos6.0和7.4默认网卡配置

    6.0 vim /etc/sysconfig/network-scripts/ifcfg-eth0 DEVICE="eth0" NM_CONTROLLED="yes&qu ...

  4. Java 面向对象 知识点基础浅谈

    1.类和对象的关系 类是一个抽象的模板,对象是根据模板制造出来的,只有类建立之后,对象才可以在类中实例化对象.举个例子讲:我要用黄金浇筑一块砖,我会在一个模型里进行,这样才能有砖的形状,那模型即是类, ...

  5. Linux 问题

    Loaded plugins: fastestmirror cd /etc/yum.repos.d mv CentOS-Base.repo CentOS-Base.repo.backup wget h ...

  6. PDF 补丁丁 0.6.0.3383 版发布(修复书签编辑器坐标定位错误的问题)

    新的测试版本修复了书签编辑器坐标定位错误的问题. 另外,增加了鼠标双击关闭功能标签的功能.

  7. git命令简介

    git作为版本控制器,多分支功能能够很好的协同开发.其中分支中分为主分支和辅助分支 主分支包括:master分支和develop分支,不多做解释 辅助分支包括一下三种分支,其中 需求分支(Featur ...

  8. vue中几种常见技巧

    1.校验延迟:点击进入页面不希望校验必填字段this.$nextTick(() => { this.$refs.formRules.clearValidate() })2.$on $emit $ ...

  9. 后端程序员必会常用Linux命令总结

    1. 调整终端窗口大小: ctrl + '-'  缩小, ctrl + shift + '='  放大. 2. command --help 查询命令详细 或者 man command 3.ls命令, ...

  10. python threading模块中的join()方法和setDeamon()方法的一些理解

    之前用多线程的时候看见了很多文章,比较常用的大概就是join()和setDeamon()了. 先说一下自己对join()的理解吧: def join(self, timeout=None): &quo ...