写一个String类,实现一下功能:
int main()
{
String s1();
String s2("hello");
String s3(s2);
cout<<s3<<endl;
s3 = s2;
cout<<s3<<endl;
}
1 Big Three 三个特殊函数
class String
{
public:
String (const char* cstr = 0);
String (const String& str);
String& operator = (const String& str);
~String();
char* get_c_str() const{return m_data;}
private:
char* m_data;
}
2 构造函数和析构函数
2.1 析构函数
inline
String::String (const char* cstr = 0)
{
if(cstr)
{
m_data = new char[strlen(str) + 1];
strcpy(m_data , cstr);
}
else
{
m_data = new char[1];
*m_data = '\0';
}
}
inline
String::~String()
{
delete[] = m_data;
}
class有指针,多半需要做动态分配,既然有了动态分配,对象死亡之前,析构函数被调用,把动态分配的内存释放
2.2 拷贝构造和拷贝赋值
class with pointer members 必须有 copy ctor和copy op=
原因:假设,String a = (“Hello”) String b = (“World”) 想要实现b = a 如果只是传统意义上b = a,那么仅仅只是把b指向字符串内容的指针,指向了a
2.2.1拷贝构造函数:
inline
String :: String(const String& str)
{
m_data = new char[strlen(str) + 1];
strcpy(m_data,str.m_data);
}
2.2.2拷贝赋值函数
一个盒子a和一个盒子b,里面都放满东西。现在,要把b里的东西放到a (1)清空a (2)b里开一个空间和a一样大(3)把a放进去
inline
String& String :: operator=(const String& str)
{
if(this == &str)检测自我赋值,必写 否则执行下面三点
会先杀掉自己,后面就没法执行了
{
return *this;
}
delete[] m_data; (1)
m_data = new char[strlen(str.m_data) + 1];(2)
strcpy(m_data,str.m_data);(3)
}
|