C+笔记七十三:MyString类案例——重载左移操作符

笔记七十二中,我们可以输出字符串的某个字符,现在我想输出整个字符串,也就是重载左移操作符。

一定要注意,cout是ostream类的一个对象!也就是说

//cout

//调用格式:operator

//只能用全局函数,因为成员函数需要写入类文件ostream中。

//声明格式:ostream& operator

完整程序

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);

private:

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

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

};

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];//可以作为左值,返回引用

}

//cout

//operator

//只能用全局函数

ostream&operator

{

cout

returnout;

}

Test.cpp

#include

#include"MyString.h"

usingnamespacestd;

intmain()

{

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

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

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

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

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

s4=s2;

s4="abcde";

cout

s4[2]='f';

cout

cout

cout

system("pause");

return0;

}

运行结果

a

f

abfde

执行完毕!

请按任意键继续. . .

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20180704A0QV5D00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。

扫码关注云+社区

领取腾讯云代金券