笔记七十二中,我们可以输出字符串的某个字符,现在我想输出整个字符串,也就是重载左移操作符。
一定要注意,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
执行完毕!
请按任意键继续. . .
领取专属 10元无门槛券
私享最新 技术干货