天天看點

C++面試題(二)——實作一個String類

實作一個自己的String類是一道考驗C++基礎知識的好題。

至少要能實作以下:構造函數、析構函數、拷貝構造函數(copy constructor)、重載指派操作符(copy assignment operator)。首先是至少能夠準确的寫出這幾個函數的聲明。

class String{
public:
	String();
	String(const char *);
	String(String rhs);
	String& operator = (String rhs);
private:
	char* data_;
}	
           

其次,老版本的拷貝構造函數和重載指派操作符時,有幾點需要注意的是:判斷自己指派給自己和異常安全性。通過使用swap可以簡化方法。下面是老版本的拷貝構造函數的實作,new的時候有可能會抛出異常。

String::String(String rhs){
   	std::swap(data_,rhs.data_);
   }
   
   String::String& operator = (Sring rhs){
   	std::swap(data_,rhs.data_);
   	return *this;
  }

String::~String(): 
delete [] data_;   	
           

}

使用swap的拷貝構造函數,通過swap将臨時變量rhs中的資料儲存到了data_中,同時data_中的資料拷貝到了臨時變量中,在函數傳回時會被自動釋放。一舉兩得,也不用擔心有異常發生了。

String::String(String rhs){
 	std::swap(data_,rhs.data_);
 }
String::String& operator = (String rhs){
	std::swap(data_,rhs.data_);
	return *this;
}

String::String():data_ = new char[1]{
	*data_ = '\0';
}