1、
class String
{
public:
String(const char *str = null);//普通構造函數
String(const String& other);//拷貝構造函數
~String();//析構函數
String& operator = (const String& other);//指派函數
String(String&& other);//移動構造
String& operator = (String&& other);//移動指派
private:
char *m_data;
};
2、構造函數
String::String(const char *str)
{
if(str == NULL)
{
m_data = new char[];
*m_data = '\0';
}
else
{
m_data = new char[strlen(str)+];
strcpy(m_data,str);
}
}
string str("hell0");
3、析構函數
String::~String()
{
delete [] m_data;
}
4、拷貝構造
String::String(const String &other)
{
m_data = new char[strlen(other.m_data)+];
strcpy(m_data,other.m_data);
}
string s1("hello");
string s2=s1;
5、拷貝指派
String& String::operator=(const String &other)
{
//檢查自指派
if(this == &other)
return *this;
delete[] m_data;//釋放原有記憶體資源
m_data = new char[strlen(other.m_data)+];
strcpy(m_data,other.m_data);
return *this;//傳回本對象的引用
}
string s1("hello");
string s2;
s2 = s1;
6、移動構造
String(String&& other):m_data(nullptr)
{
m_data = other.m_data;
other.m_data = nullptr;
}
//或者借用move()
String(String&& other):m_data(std::move(other.m_data))
{
}
7、移動指派
String& operator = (String&& other)
{
if(this!=&other)
{
delete[] m_data;
m_data = other.m_data;
other.m_data = nullptr;
}
return *this;
}
//或者借用move()
String& operator = (String&& other)
{
m_data = move(other.m_data);
return *this;
}
8、指派操作符的
如果不加const的話:
string s3("pello");
const string s4("qello");
s3 = s4;
這樣就會,因為一個 const 變量不能随意轉化成非const變量
另外,
string s7("pello");
string s8("pellp");
string s9("qellp");
s9 = s7+s8;
不用const 會報錯,因為 + 指派必須傳回一個操作值已知的string對象 ,除非他是一個const對象