昨天參加了完美世界的筆試,有一個題是寫出C++中String類的構造函數,析構函數,拷貝構造函數和賦值函數。
題中給出了四個函數的接口,大致如下所示。
class String{ public: String(const char* str=NULL); String(const String &other); String& operator=(const String& other);
~String(void) {delete[] m_data;} private: char *m_data; // 用於保存字符串 };
當時一直想不明白在拷貝構造和賦值函數中,怎么獲取參數的私有成員,導致這個題沒答出來。
回來查了一下String類的實現才明白,封裝性是對類外的操作來說的,在類內操作本類的一個對象時,可以通過該對象訪問其私有成員,這種設計也是挺合理的,因為類是自己設計的,當然自己也就知道類的內部結構,所以沒有必要對自己也進行類的“封裝”。另有一種說法是:“同種類之間是友元關系”。
所以對於拷貝構造函數和賦值函數按下面方法寫是沒問題的。
inline String::String(const String &other) { if(!other.m_data)m_data=0; else { m_data=new char[strlen(other.m_data)+1]; strcpy(m_data,other.m_data); } } inline String& String::operator=(const String& other) { if (this!=&other) { delete[] m_data; if(!other.m_data) m_data=0; else { m_data = new char[strlen(other.m_data)+1]; strcpy(m_data,other.m_data); } } return *this; }
