要求自實現string的基本函數,建構函式,解構函式等,緣分呐,不得不認真對待一下,回來仔細查了下,總結一下:C++實現的代碼
#include<iostream.h>
class string{
public:
string(const char*str=NULL);//注意指標常量和常量指標的區別,const在前表示是常量(指標)而不
//是指標常量
string(const string&other);
~string();
string&operator=(const string & other);
void print()
{
cout<<m_data<<endl;
}
private:
char*m_data;
};
string::string(const char*str){//注意在類外實現成員函數時的表達方式
const char*p=str;//只能用一個常量指標變數來指向常量指標變數,而不能用一般的指標變數來指向一個常量指標
while(*p!='\0')p++;
m_data=new char[p-str+1];//在開闢儲存空間時,原則上也可以用一個char*指標指向字串(數組),但這樣做是很危險的,因為字元指標可能會指向不可知的位置,所以我們在為m_data申請空間的時候是以數組的方式申請而不是用new char,注意要為串結束符\0申請空間。
//m_data=new char;
char*q=m_data;
while(*str){*q++=*str++;}
*q='\0';//一定要記得加串結束符
}
string::string(const string&other){
char*q=other.m_data;
while(*q++);
m_data=new char[q-other.m_data+1];
char*p=m_data;
char*r=other.m_data;//
while(*p++=*r++);
}
string::~string(){
if(m_data)
delete[] m_data;//釋放字元數組
}
string& string::operator=(const string&other)
{
//拷貝建構函式在返回時需要返回一個有效引用,不能返回對一個局部變數的引用
if(m_data) delete[] m_data;//先釋放掉以前的記憶體
if(other.m_data)
{
char*q=other.m_data;
while(*q++);
m_data=new char[q-other.m_data+1];
char*p=m_data;
char*r=other.m_data;//
while(*p++=*r++);
}
else m_data=NULL;
return *this;//返回當前對象
}
void main()
{
string s("dhhh");
s.print();
string s1(s);
s1.print();
string s2=s;
s2.print();
return;
}