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[1];
*m_data = '\0';
}
else
{
m_data = new char[strlen(str)+1];
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)+1];
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)+1];
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;
}
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对象