首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

C+笔记七十四:MyString类案例——重载双等号和不等号操作符

这一部分重点要知道一个函数strcmp。

C/C++函数,比较两个字符串

设这两个字符串为str1,str2,

(1)若str1==str2,则返回零;

(2)若str1

(3)若str1>str2,则返回正数。

1

MyString.h

#pragmaonce

usingnamespacestd;

classMyString

{

//重载左操作符友元函数

friendostream&operator

public:

//无参构造函数,定义一个空串

MyString(void);

//有参构造函数

MyString(constchar*p);

//拷贝构造函数

MyString(constMyString& s);

//析构函数

~MyString(void);

public:

//等号操作符重载函数s4=s2;

MyString&operator=(constMyString& str);

//等号操作符重载函数s4="ab";

MyString&operator=(constchar* str);

//重载[]操作符

char&operator[](intindex);

//重载双等号操作符

booloperator==(MyString& str);

booloperator==(char*p);

//重载不等号操作符

boolMyString::operator!=(MyString& str);

boolMyString::operator!=(char* p);

private:

intm_len;//储存字符串的长度

char*m_p;//指向字符串所在内存的首地址

};

2

MyString.cpp

#define_CRT_SECURE_NO_WARNINGS

#include

#include"MyString.h"

//无参构造函数,定义一个空串

MyString::MyString(void)

{

m_len=0;

m_p=newchar[m_len+1];

strcpy(m_p,"");

}

//有参构造函数

MyString::MyString(constchar*p)

{

if(NULL==p)

{

m_len=0;

m_p=newchar[m_len+1];

strcpy(m_p,p);

}

else

{

m_len=strlen(p);

m_p=newchar[m_len+1];

strcpy(m_p,p);

}

}

//拷贝构造函数

MyString::MyString(constMyString& s)

{

m_len=s.m_len;

m_p=newchar[m_len+1];

strcpy(m_p,s.m_p);

}

//析构函数

MyString::~MyString(void)

{

if(m_p!=NULL)

{

delete[]m_p;

m_p=NULL;

m_len=0;

}

}

//重载等号操作符,考虑链式编程

//s4=s2

//s4.operator=(s2)

//MyString& operator=(const MyString& str)

//s4的指针已经分配内存空间了,因此需要先把旧的释放掉

MyString& MyString::operator=(constMyString& str)

{

//(1)把旧的内存释放掉

if(m_p!=NULL)

{

delete[]m_p;

m_len=0;

}

//(2)根据str分配内存,str是类的对象,至少是空串

m_len=str.m_len;

m_p=newchar[m_len+1];

strcpy(m_p,str.m_p);

return*this;

}

//重载等号操作符,考虑链式编程

//s4="ab"

//s4.operator=("ab")

//MyString& operator=(const char* str)

//s4的指针已经分配内存空间了,因此需要先把旧的释放掉

MyString& MyString::operator=(constchar* str)

{

//(1)把旧的内存释放掉

if(m_p!=NULL)

{

delete[]m_p;

m_len=0;

}

//(2)根据str分配内存

if(NULL==str)

{

m_len=0;

m_p=newchar[m_len+1];

strcpy(m_p,"");

}

else

{

m_len=strlen(str);

m_p=newchar[m_len+1];

strcpy(m_p,str);

}

return*this;//支持链式编程,返回引用

}

//重载数组小标[]操作符

//s4[i]

//s4.operator[](int i)

//char& operator[](int i)

char& MyString::operator[](intindex)

{

returnm_p[index];//可以作为左值,返回引用

}

//重载双等号操作符

//s3==s4

//s3.operator==(s4)

//bool operator==(MyString& str)

boolMyString::operator==(MyString& str)

{

if(m_len!=str.m_len)

{

returnfalse;

}

return!strcmp(this->m_p,str.m_p);

}

//重载双等号操作符

//s3=="abcd"

//s3.operator==("abcd")

//bool operator==(char *p)

boolMyString::operator==(char*p)

{

if(NULL==p)

{

if(0==m_len)

{

returntrue;

}

returnfalse;

}

else

{

if(m_len==strlen(p))

{

//strcmp比较字符串是否相等,相等返回

return!strcmp(m_p,p);

}

else

{

returnfalse;

}

}

}

//重载不等号操作符

//s3!=s4

//s3.operator!=(s4)

//bool operator!=(MyString& str)

boolMyString::operator!=(MyString& str)

{

return!(*this==str);

}

//重载不等号操作符

//s3!="abcd"

//s3.operator!=("abcd")

//bool operator!=(char* p)

boolMyString::operator!=(char* p)

{

return!(*this==p);

}

//cout

//operator

//只能用全局函数

ostream&operator

{

cout

returnout;

}

3

Test.cpp

#include

#include"MyString.h"

usingnamespacestd;

intmain()

{

//类定义对象时才调用构造函数

MyString s1;//调用无参构造函数

MyString s2("s2");//调用有参构造函数

MyString s3=s2;//调用拷贝构造函数深拷贝

MyString s4="abcdefg";//调用有参构造函数

//重载双等号有两种情况

//第一种

if(s2==s3)

{

cout

}

else

{

cout

}

//第二种

if(s2=="abcd")

{

cout

}

else

{

cout

}

//重载双等号有两种情况

//第一种

if(s3!=s4)

{

cout

}

else

{

cout

}

//第二种

if(s3!="abcd")

{

cout

}

else

{

cout

}

cout

system("pause");

return0;

}

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20180730A0YZHG00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券