//对于一般的类,如Complex类,系统会默认重载赋值运算符,但有些类对于系统默认的赋值运算符无法满足要求,这个时候就要用户自己来重载赋值运算符。另外,赋值运算符只能用成员函数重载,不能用友元函数重载。
#include <iostream>
#include <assert.h>
#include <string.h>
using namespace std;
class cstring
{
public:
cstring(char *str="");
cstring(const cstring &str);
cstring operator+(const cstring &str);
//赋值运算符只能用成员函数重载,不能被继承,用户自己不重载系统会默认冲在一个(但不一定能满足要求)
cstring &operator=(const cstring &str);
//重载函数调用运算符,只能用成员函数
int operator()();
//重载下标运算符,只能用成员函数
char operator[](int i);
void print(void);
private:
char *m_pstr;
int m_isize;
};
cstring::cstring(char *str)
{
if(str == NULL)
{
m_isize = 0;
m_pstr = NULL;
}
else
{
m_isize = strlen(str) + 1;
m_pstr = new char[m_isize + 1];
assert(m_pstr);
strcpy(m_pstr,str);
}
}
cstring::cstring(const cstring &str)
{
if(str.m_isize == 0)
{
m_isize = 0;
m_pstr = NULL;
}
else
{
m_isize = str.m_isize;
m_pstr = new char[m_isize];
assert(m_pstr);
strcpy(m_pstr,str.m_pstr);
}
}
cstring cstring::operator +(const cstring &str)
{
cstring s1;
s1.m_isize = str.m_isize + m_isize - 1;
s1.m_pstr = new char[s1.m_isize];
assert(s1.m_pstr);
strcpy(s1.m_pstr,m_pstr);
strcat(s1.m_pstr,str.m_pstr);
return s1;
}
cstring & cstring::operator =(const cstring &str)
{
if(&str == this)
{
return *this;
}
if(m_isize > 0)
{
delete []m_pstr;
}
m_isize = str.m_isize;
m_pstr = new char[m_isize];
assert(m_pstr);
strcpy(m_pstr,str.m_pstr);
return *this;
}
int cstring::operator ()()
{
return m_isize;
}
char cstring::operator [](int i)
{
if(i >= m_isize)
{
return '\0';
}
else
{
return m_pstr[i];
}
}
void cstring::print()
{
cout << m_pstr << endl;
}
int main(int argc,char *argv[])
{
cstring s1("hello"),s2(" every one!"),s3;
s3 = s1 + s2;
s3.print();
cout << s3() << endl;
cout << s3[8] << endl;
return 0;
}