1. 程式人生 > >小和尚上山去拜師-面試題_實現string()拷貝建構函式

小和尚上山去拜師-面試題_實現string()拷貝建構函式

*通過實現拷貝建構函式對理解c++初始化類物件很有幫助*/
class String
 {
 public:
  String(const char *str=NULL);     //含引數的構造
  String(const String &other);        //複製構造
  String& operator=(const String &other); //賦值構造
 private:
  char *m_data;    
 };

//含引數的構造
 String::String(const char *str)
 {
 if (str==NULL)  {     //指標字串為空 申請一個字元空間儲存'\0'
   m_data=new char[1];
   m_data[0]='\0';
  }else
  {
   int len=strlen(str);
   m_data=new char[len+1];  //由於strlen()函式獲取的不包含最後一個‘\0’所以要加一
   strcpy(m_data,str);
  }
 }
//複製建構函式

String::String(const String &other)
 {
  //
  int len=strlen(other.m_data);
  m_data=new char[len+1];
  strcpy(m_data,other.m_data);
}

//賦值構造
String & String::operator =(const String &other)
 {
  if (&other!=this) //防止自我賦值
  {
   if (m_data!=NULL)  //可有可無,實現最好
   {
    delete []m_data;  //[] 注意這個的作用
    m_data=NULL; //在這裡為什莫要把被賦值的變數確保刪除,如果不刪除會出現什莫問題?
   }
  int len=strlen(other.m_data);
  m_data=new char[len+1];
  strcpy(m_data,other.m_data);
 }

 return *this;
 }

//解構函式
 String::~String(void)
 {
  if (m_data!=NULL)
  {
   delete []m_data;
   m_data=NULL;
  }
 }

相關推薦

和尚上山拜師-試題_實現string()拷貝建構函式

*通過實現拷貝建構函式對理解c++初始化類物件很有幫助*/ class String { public: String(const char *str=NULL); //含引數的構造

試題14——談談對拷貝建構函式和賦值運算子的認識

拷貝建構函式和賦值運算子過載有以下兩個不同之處: (1)拷貝建構函式生成新的類物件,賦值運算子不能; (2)由於拷貝建構函式是直接構造一個新的類物件,所以在初始化這個物件之前不需要檢測原物件是否和新建物件相同,而賦值運算子則需要這個操作,另外賦值運算中如果原來的物件中有記憶體分配要先把記憶體

試題_抽象類和介面的區別

含有abstract修飾符的class 即為抽象類。abstract類不能建立例項物件;含有abstract的方法的類必須定義為abstract class ;abstract class 裡的方法不必是抽象的;抽象類中定義抽象方法必須放在具體子類中實現;所以呀,不能有抽象的

試題_平安,大廈,湖濱路,一,賬通

20180822上海平安一賬通的專案面試題回憶 1畫出你做的系統的體系圖or結構圖 2樂觀鎖和悲觀鎖的意思,怎麼實現 3.多執行緒的實現方法有哪些,多執行緒的各種狀態以及他們之間怎麼變化的。特別是如何才能中止多執行緒 4集合類具體有哪些實現,越詳細越好,以及裡面

和尚上山學習之智慧指標(六)--boost::weak_ptr

boost::weak_ptr 屬於 boost 庫,定義在 namespace boost 中,包含標頭檔案 #include<boost/smart_ptr.hpp> 便可以使用。在講 boost::weak_ptr 之前,讓我們先回顧一下前面講解的內容。似乎

試題實現一個棧,要求Push(入棧),Pop(出棧),Min(返回最值的操作)的時間複雜度為O(1)

問題描述:實現一個棧,要求Push(入棧),Pop(出棧),Min(返回最小值的操作)的時間複雜度為O(1)  分析問題:要記錄從當前棧頂到棧底元素的最小值,很容易想到用一個變數,每push一個元素更新一次變數的值。那麼問題來了,當執行pop操作時,上一次的最小值就找不到

和尚上山學習之智慧指標(二)--boost::scoped_ptr

boost::scoped_ptr:屬於 boost 庫,定義在 namespace boost 中,包含標頭檔案 #include<boost/smart_ptr.hpp> 便可以使用。boost::scoped_ptr 跟 std::auto_ptr 一樣,可

黑馬程式設計師_7K試題_交通燈管理系統

-面向物件分析設計經驗:誰用於資料,誰就對外提供操作這些資料的方法。 典型案例:      人在黑板上畫圓。 分析: 共有三個物件:人、黑板、圓。動作:畫 畫圓需要圓心和半徑,圓心和半徑都是圓的屬性上,圓擁有資料,所以圓物件提供畫圓的方法 圓在黑板上,黑板擁有

棧和隊列的試題Java實現

size article static row ray exce public http queue 參看博客:http://www.imooc.com/article/1515 但是代碼在兩個隊列實現一個棧的時候代碼存在問題 正確代碼如下: import java.ut

試題:ConcurrentHashMap實現線程安全的原理

tab 其它 安全 segment nth htable 一個 需要 鎖定 在ConcurrentHashMap沒有出現以前,jdk使用hashtable來實現線程安全,但是hashtable是將整個hash表鎖住,所以效率很低下。 ConcurrentHashMap將數據

【劍指offer】試題 2. 實現 Singleton模式

模式 試題 枚舉 生成 test hand true 方法 單例模式 面試題 2. 實現 Singleton模式 題目:設計一個類,我們只能生成該類的一個實例。 單例模式:確保一個類只有一個實例,並提供了一個全局訪問點。 Code 1.餓漢模式 //餓漢模式 publ

程式設計師試題(C++ 實現) - Day1

文章目錄 說明 題目一覽 1. 二維陣列中的查詢 2. 替換空格 3. 從尾到頭列印連結串列 4. 重建二叉樹 5. 用兩個棧實現佇列 聯絡博主

程式設計師試題(C++ 實現) - Day2

文章目錄 說明 今日題目一覽 1. 旋轉陣列中的最小數字 2. 斐波那契數列 3. 跳臺階(變態跳臺階) 4. 矩形覆蓋 5. 二進位制中 1 的個數 聯絡博主

劍指offer-試題1:賦值運算子函式

如下為型別CMyString的宣告,請為該型別新增賦值運算子函式。 解析:給一個類進行運算子過載。 關鍵部分程式碼: CMyString& CMyString::operator =(const CMyString &str) { if(this == &str)

Hive試題:hive有哪些udf函式,作用

UDF(user-defined function)作用於單個數據行,產生一個數據行作為輸出。(數學函式,字串函式) UDAF(使用者定義聚集函式 User- Defined Aggregation Funcation):接收多個輸入資料行,併產生一個輸出資料行。(count,max)

《劍指Offer》試題1:賦值運算子函式

// 面試題1:賦值運算子函式 // 題目:如下為型別CMyString的宣告,請為該型別新增賦值運算子函式。 class CMyString {        public:               CMyString(char* pData = nullptr);             

程式設計師試題(C++ 實現)

說明 以下題目均來自於牛客網 以下程式碼用 C++11 編寫 以下程式碼均已編譯通過(Compile by MINGW) 以下程式碼均有測試案例(Main function) 以下程式碼均已進行優化或部分優化(Optimize) 以下程式碼均有註釋(Com

[C/C++筆試試題] 程式設計基礎 - 位操作、函式、陣列篇

7 位操作 二進位制是現代計算機發展的基礎,所有的程式程式碼都需要轉換成最終的二進位制程式碼才能執 行。合理地進行二進位制的位操作,對於編寫優質程式碼,特別是嵌入式應用軟體開發非常關鍵。 7.1 一些結構宣告中的冒號和數字是什麼意思? c語言的結構體可以實現位段,它的定義形式是在一個定義的結構體成員後面

有關遞迴演算法的試題java實現

什麼叫遞迴? 遞迴是方法(函式)呼叫方法本身的一種程式設計技巧; 使用遞迴需要滿足2個條件:     1)有反覆執行的過程(呼叫自身)     2)有跳出反覆執行過程的條件(遞迴出口) 遞迴演算法的應

試題 模擬實現strlen函式的3種方法。

第一種方法是用計數器模擬實現strlen函式。#include<stdio.h> #include<assert.h> int my_strlen(const char *str) { int count = 0; assert(str!=NUL