需要注意的点:
自己实现一个String类,需要注意的点:
拷贝构造函数和赋值运算符重载要写深拷贝
拷贝构造函数和赋值运算符重载的区别是,拷贝构造需要申请空间,但是赋值运算符重载不需要,它需要释放原有的空间,并考虑自赋值
赋值运算符重载返回值是引用。
构造函数,如果使用空指针构造,则申请一个字节加\0
析构函数要释放空间
函数的默认参数写在声明中,不用写在定义中(?)
判断自赋值:使用对象的地址——this进行判断,而不能使用*this
#include<iostream>
#include<cstring>
using namespace std;
class String{
public:
String(const char* str=nullptr);
String(const String& copy);
~String();
String & operator=(const String& copy);
friend ostream & operator<<(ostream & os,const String& obj);
private:
char* m_str;
int m_length;
};
ostream & operator<<(ostream & os,const String& obj){
os<<obj.m_str;
return os;
}
// str=nullptr)
String::String(const char* str){
if(str==nullptr){
// char[1] wrong writed as char(1)
m_str=new char[1];
m_str[0] = '\0';
m_length=0;
}else{
// don't know to use sizeof
m_length=strlen(str);
m_str=new char[m_length+1];
strcpy(m_str,str);
}
}
String::String(const String& copy){
m_length=copy.m_length;
m_str=new char[m_length+1];
strcpy(m_str,copy.m_str);
}
String::~String(){
delete[] m_str;
}
String& String::operator=(const String& copy){
//(*this==copy)
if(this==©){
return *this;
}else{
delete[] m_str;
m_length=copy.m_length;
m_str=new char[m_length+1];
strcpy(m_str,copy.m_str);
}
return *this;
}
int main(){
String myString("abc");
String myString2;
myString2 = myString;
String myString3(myString2);
cout<<"myString:"<<myString<<endl;
cout<<"myString2:"<<myString2<<endl;
cout<<"myString3:"<<myString3<<endl;
return 0;
}