string類的建構函式,拷貝建構函式,解構函式和賦值函數
來源:互聯網
上載者:User
String 類的原型如下class String{ public: String(const char *str=NULL); //建構函式 String(const String &other); //拷貝建構函式 ~String(void); //解構函式 String& operator=(const String &other); //等號操作符重載,賦值函數 ShowString(); private: char *m_data; //字元指標};String::~String(){ delete [] m_data; //解構函式,釋放地址空間}String::String(const char *str){ if (str==NULL)//當初始化串不存在的時候,為m_data申請一個空間存放'/0'; { m_data=new char[1]; *m_data='/0'; } else//當初始化串存在的時候,為m_data申請同樣大小的空間存放該串; { int length=strlen(str); m_data=new char[length+1]; strcpy(m_data,str); }}String::String(const String &other)//拷貝建構函式,功能與建構函式類似。{ int length=strlen(other.m_data); m_data=new [length+1]; strcpy(m_data,other.m_data);}String& String::operator =(const String &other) //賦值函數{ if (this==&other)//當地址相同時,直接返回; return *this; delete [] m_data;//當地址不相同時,刪除原來申請的空間,重新開始構造; int length=sizeof(other.m_data); m_data=new [length+1]; strcpy(m_data,other.m_data); return *this; } String::ShowString()//由於m_data是私人成員,對象只能通過public成員函數來訪問;{ cout<<this->m_data<<endl;} 測試一下: main(){String AD;char * p="ABCDE";String B(p);AD.ShowString();AD=B;AD.ShowString();}=========================================================================
再來淡淡關於拷貝建構函式和賦值函數的使用比較 上例是比較拷貝建構函式和賦值函數很好的樣本。 拷貝建構函式,首先是一個建構函式,因此函數實現的是拷貝它唯一const參數引用變數(也是對象)的內部資料作為初始化。所以對象建立時使用構造拷貝函數(這時需要初始化對象)。 而賦值函數則不同。賦值函數屬於類的成員函數,並且是一個運算子多載函數。該函數應用在對象已經建立後,需要對對象賦值時使用。由於是重載函數,返回的是一個對象,而拷貝建構函式不用返回任何值。 String a("zhangbufeng"); String b("cuixiaoyuan"); String c(a);//對象建立時,使用拷貝建構函式 c=b; //c已經被初始化,從而調用了賦值函數。