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;
}
c++ — 运算符重载与strcmp自实现的更多相关文章
- C++程序设计方法3:数组下标运算符重载
数组下标运算符重载 函数声明形式 返回类型operator[](参数): 如果返回类型是引用,则数组运算符调用可以出现在等式的左边,接受赋值,即: Obj[index] = value; 如果返回类型 ...
- 编码实现字符串类CNString实现运算符重载
题目描述: 编码实现字符串类CNString,该类有默认构造函数.类的拷贝函数.类的析构函数及运算符重载,需实现以下"="运算符."+"运算."[]& ...
- String 类实现 以及>> <<流插入/流提取运算符重载
简单版的String类,旨在说明>> <<重载 #include <iostream> //#include <cstring>//包含char*的字符 ...
- c++知识点总结--友元&运算符重载
友元函数(不属于类) 可以访问类的私有变量,以及私有函数 友元函数在类内声明需要friend关键字,类外定义就不需要 友元函数可以直接在类内定义 友元函数必须包含对象指针 友元类(不适用继承,只适 ...
- C++编写字符串类CNString,该类有默认构造函数、类的拷贝函数、类的析构函数及运算符重载
编码实现字符串类CNString,该类有默认构造函数.类的拷贝函数.类的析构函数及运算符重载,需实现以下“=”运算符.“+”运算.“[]”运算符.“<”运算符及“>”运算符及“==”运算符 ...
- string类中运算符重载实现
C++中预定义的加.减等运算符的操作对象只能是基本的数据类型.如果要在用户自定义的类型对象上应用同样的运算符,就需要通过运算符重载来重新定义其实现,使它能够用于自定义类型执行特定的操作,所以运算符重载 ...
- 五、C++运算符重载,使面向对象编程更方便
复数类CComplex 编译器做对象运算的时候,会调用对象的运算符重载函数(优先调用成员方法):如果没有成员方法,就砸全局作用域找合适的运算符重载函数 ++和--运算符是单目运算符,在参数列表里放上一 ...
- 深入C++05:运算符重载
运算符重载 1.复数类 运算符重载目的:使对象运算表现得和编译器内置类型一样: 复数类例子 #include<iostream> using namespace std; class CC ...
- C++ 运算符重载时,将运算符两边对象交换问题.
在C++进行运算符重载时, 一般来讲,运算符两边的对象的顺序是不能交换的. 比如下面的例子: #include <iostream> using namespace std; class ...
随机推荐
- An overnight dance in discotheque CodeForces - 814D (几何)
大意: 给定n个不相交的圆, 求将n个圆划分成两部分, 使得阴影部分面积最大. 贪心, 考虑每个连通块, 最外层大圆分成一部分, 剩余分成一部分一定最优. #include <iostream& ...
- java中,字符串和集合判断是否为空
字符串: 集合: 不为空
- echarts常用方法,饼图切换圆环中文字(三)
在echarts的饼图应用时,遇到过一个需求就是鼠标移到半环上可以切换环中的文字,同时支持legend点击事件.误区是,鼠标移动到环上重新渲染option,以切换内部的文字.重新渲染option的做法 ...
- Android 工程越来越大,运行变卡解决方法
打开AS的安装目录 android-studio/bin/studio.exe.vmoptions studio64.exe.vmoptions -Xms2048m-Xmx2048m-XX:Reser ...
- Debian Nginx 下载 .apk 文件时候报 403 错误 [1]
一.版本介绍 Degian : 8 jessie Nginx : 1.6.2 发生时间 : 2018-12-15 二.问题说明 客户浏览器访问Nginx的公开目录中放入了一个.apk文件,公开目录可 ...
- java打jar包小总结
一 命令行方法 编译java 在bin目录下,也就是class所在目录下命令行输入如下命令进行归档处理 jar -cvf mylib.jar *.class 现在你可以看见一个已经生成的jar包了 此 ...
- bom头
最近做ecshop经常碰到bom头问题,具体表现用chrome开发工具查看会出现小红点, 具体删除办法见网上,我是用老文件copy再替换内容.
- 数据库的数据进行改动,Cognos报表展示未及时更新
1. 问题描述 手工修改了DB中的测试数据,但是返回报表看,数据还没有更新 2. 问题分析 这是因为Cognos为了查询效率设计了高速缓存的选项 3. 解决方案 方法1:在数据包端禁用高速缓存,那么所 ...
- 前端页面的适配使用rem换算
前端页面的适配使用rem换算 https://www.cnblogs.com/liangxuru/p/6970629.html 注:本文转载之处:https://www.cnblogs.com/ann ...
- 带你领略Linux系统发展及版本更迭
Linux的出现是在1991年,Linus Torvalds的学生开发的,最初的Linux是类似Unix操作系统,可用于386,486或奔腾处理器的计算机上.Linus Torvalds是一个伟人,他 ...