拷贝赋值 和 拷贝构造函数

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;

String str2 = str1;      //拷贝构造  String str2 = str1会执行相应的构造函数

cout << str2.get_c_str();

        cout<<endl;

//拷贝赋值
String str3;
str3 = str2;                            //这里会执行 会执行拷贝赋值函数

cout << str3.get_c_str(); //输出为huxiaoguang 

        cout<<endl;

return 0;
}

程序输出的结果:

    【c++的深度剖析教程】拷贝赋值 拷贝构造 这一种是针对类中含有指针的情况

程序可以看注释:

依照程序主要讨论的内容---------主要是针对一个class类中包含相应的指针这种类型设计

第一点:对于构造函数

String str2 = str1;   系统默认的提供的构造函数是浅拷贝


inline String::String(const String &str): 自己提供的是深拷贝


第二点:对于赋值函数

str2 = str1 ;            对于系统提供的复制 是浅拷贝

String& operator=(const String &str); 提供的是复制  是深拷贝



浅拷贝:系统默认提供,主要进行赋值拷贝 。特别是存在指针的时候,str2和str1的指针的值会相等,只想同一个地方

而产生错误。

浅拷贝和深拷贝的区别。


【c++的深度剖析教程】拷贝赋值 拷贝构造 这一种是针对类中含有指针的情况















相关文章: