接着上次的运算符重载:
先给出以下代码用于引出后面的运算符重载函数:
class STR
{
public:
STR(char *str= "") //构造函数
{
m_str = new char[strlen(str)+1];
strcpy(m_str, str);
}
STR(char c) //构造函数
{
m_str = new char[2];
m_str[0] = c;
m_str[1] = '\0';
}
STR(char c, int n) //构造函数
{
m_str = new char[n+1];
memset(m_str, c, n); //关键
m_str[n] = '\0'; //注意是m_str[n] = '\0'
}
~STR() //析构函数
{
if(m_str != NULL)
{
delete []m_str;
m_str = NULL;
}
}
STR(STR &s) //拷贝构造函数
{
m_str = new char[strlen(s.m_str)+1];
strcpy(m_str, s.m_str);
}
void print()
{
cout<<m_str<<endl;
}
private:
char *m_str;
};
void main()
{
STR a("abcd");
a.print();
STR b('e');
b.print();
STR c('f',3);
c.print();
}
- 赋值运算符重载:
STR& STR:: operator=(STR &s) //赋值重载函数
{
if(this == &s) //判断赋值的内容是否一样
return *this;
if(m_str != NULL)
{
delete []m_str; //将m_str的空间释放
}
m_str = new char[strlen(s.m_str)+1]; //为m_str重新开辟空间
strcpy(m_str, s.m_str); //将s.m_str的内容复制到m_str中
return *this;
}
//主函数
void main()
{
STR a("abcd");
a.print();
STR b('e');
b.print();
STR c('f',3);
c.print();
(a=b).print();
}
运行结果如下:
2. 加法运算符:
STR STR::operator+(STR &s)
{
char *p = new char[strlen(m_str) + strlen(s.m_str) + 1]; //因为要将两个字符串连接起来,所以要先开辟一个能存放两个字符串的空间
strcpy(p, m_str); //先将m_str拷贝到p中
strcat(p, s.m_str); // 再将s.m_str连接到p的后面
STR t(p); //因为要将p空间释放掉,所以必须将p中的内容放在一个对象中
delete []p; //将p释放掉
p = NULL;
return t; //将t返回
}
//主函数
void main()
{
STR a("abcd");
a.print();
STR b('e');
b.print();
STR c('f',3);
c.print();
(a+b).print();
}
运行结果:
3. +=运算符重载:
STR& STR:: operator+=(STR &s)
{
char *p = new char[strlen(m_str) + strlen(s.m_str) + 1];
strcpy(p,m_str);
strcat(p,s.m_str);
m_str = p;
return *this;
}
//主函数
void main()
{
STR a("abcd");
a.print();
STR b('e');
b.print();
STR c('f',3);
c.print();
(a+=c).print();
}
测试结果如下:
4. [ ]运算符重载:
char STR:: operator[](int i)
{
if(i>0 && i<strlen(m_str))
return m_str[i];
}
//主函数
void main()
{
STR a("abcd");
a.print();
STR b('e');
b.print();
STR c('f',3);
c.print();
cout<<a[3]<<endl;
}
运行结果:
5. ==运算符重载:
bool STR::operator==(STR &s)
{
return strcmp(m_str,s.m_str) == 1;
}
//主函数
void main()
{
STR a("abcd");
a.print();
STR b('e');
b.print();
STR c('f',3);
c.print();
cout<<(a==c)<<endl;
}
运行结果:
以下的运算符重载就不给运行结果了:
6. !=运算符重载:
bool STR::operator!=(STR &s)
{
return !(*this==s); //或者写成return !(m_str==s.m_str);
}
- >运算符重载:
bool STR::operator>(STR &s)
{
return strcmp(m_str,s.m_str)==1;
}
8.
operator char*() //类型转换
{
return m_str;
}