拷贝赋值 和 拷贝构造函数
class String
{
public:
String(const char *cstr = 0); //一般构造函数
String(const String &str); //拷贝构造
String& operator=(const String &str); //拷贝赋值 (深拷贝 浅拷贝)
~String();
public:
char *get_c_str() const { return m_data;}
public:
char *m_data;
};
inline
String::String(const char *cstr ) . //一般的构造函数
{
if (cstr){
m_data = new char[strlen(cstr) + 1];
strcpy(m_data, cstr);
}
else{
m_data = new char[1];
m_data = '\0';
}
}
//拷贝构造
inline
String::String(const String &str) //在写接口的时候 需要考虑两部分 1.是否需要加const 或者valute 2.是否需要加引用
{
m_data = new char[strlen(str.m_data) + 1];
strcpy(m_data, str.m_data);
}
inline
String & String::operator=(const String &str) //拷贝赋值 当执行str1=str2的时候 就会执行这个函数
{
if (this == &str) //这个判断语句是必须要加的
return *this; //这一点必须要强加上去 ,否则一旦 s1=s1就会发生错误。
delete[] m_data;
m_data = new char[strlen(str.m_data) + 1];
strcpy(m_data, str.m_data);
return *this;
}
inline
void String::set_c_str(){
m_data = "gaibian";
}
inline String::~String()
{
delete[] m_data;
}
int _tmain(int argc, _TCHAR* argv[])
{
String str1("huxiaoguang"); //构造函数
cout << str1.get_c_str();
cout <<endl;
cout << str2.get_c_str();
cout<<endl;
String str3;
str3 = str2; //这里会执行 会执行拷贝赋值函数
cout << str3.get_c_str(); //输出为huxiaoguang
cout<<endl;
}
程序输出的结果:
程序可以看注释:
依照程序主要讨论的内容---------主要是针对一个class类中包含相应的指针这种类型设计
第一点:对于构造函数
String str2 = str1; 系统默认的提供的构造函数是浅拷贝
inline String::String(const String &str): 自己提供的是深拷贝
第二点:对于赋值函数
str2 = str1 ; 对于系统提供的复制 是浅拷贝
String& operator=(const String &str); 提供的是复制 是深拷贝
浅拷贝:系统默认提供,主要进行赋值拷贝 。特别是存在指针的时候,str2和str1的指针的值会相等,只想同一个地方
而产生错误。
浅拷贝和深拷贝的区别。