1.防卫式声明
2.字符串是大小不固定的,那就是用指针来动态分配内存,用new的方式动态分配一个内存,所以在private中应该是一个char* m_data;
3.接下来准备构造函数,放在public里,构造函数与class同名。String(const char* cstr=0);给予默认值0;
4.类内带有指针,就要去考虑三个特殊函数:
拷贝构造(String (const String& str);)
拷贝赋值(String& operator=(const String& str);)
析构函数(~String();)
5.取字符串 char* get_c_str() const {return m_data;};
6.ctor:放在class本体外来写。
构造函数的步骤:分配空间,转型(编译器),传参。别忘记判断传入的是否有效。
String::String(const char* cstr = 0)
{
if(cstr)
{
m_data=new char[strlen(cstr)+1];
stcpy(m_data,cstr);
}
else
{
m_data=new char[1];
*m_data='/0';
}
}
7.dtor:放在本体外来写,尽量写上inline
String::~String()
{
delete[] m_data;
}
8.copy ctor(拷贝构造)
拷贝构造就是来源端拷贝到目的端,分配空间,再拷贝,代码如下:也希望成为内敛函数,代码没加inline
String::String(const String& str)
{
m_data=new char[strlen(str.m_data)+1];
strcpy(m_data,str.m_data);
}
关于inline什么时候加,什么情况都能加,编译器会自己判断,没有不好的影响。
9.拷贝赋值
inline
String& String::operator=(const String& str)
{
if(this==&str)
return *this;
delete[] m_data;
m_data=new char[strlen(str.m_data)+1];
strcpy(m_data,str.m_data);
return *this;
}
关于拷贝赋值的返回值,为什么是String&而不是void:假设赋值语句a=b;这句话不管是String&还是void,都是没问题,但是如果是a=b=c;那么就会出错。
以及String&与&str两个&符号的含义,一个是引用,一个是取地址。在我的学习笔记有记录:指针与引用
以及良好的习惯,需要判断是否自我赋值,若没有,不仅是效率问题,也可能会出错。