亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C++ > 正文

分享C++面試中string類的一種正確寫法

2020-01-26 15:42:51
字體:
來源:轉載
供稿:網友

具體來說:

能像 int 類型那樣定義變量,并且支持賦值、復制。
能用作函數的參數類型及返回類型。
能用作標準庫容器的元素類型,即 vector/list/deque 的 value_type。(用作 std::map 的 key_type 是更進一步的要求,本文從略)。
換言之,你的 String 能讓以下代碼編譯運行通過,并且沒有內存方面的錯誤。

復制代碼 代碼如下:

void foo(String x) 



void bar(const String& x) 



String baz() 

  String ret("world"); 
  return ret; 


int main() 

  String s0; 
  String s1("hello"); 
  String s2(s0); 
  String s3 = s1; 
  s2 = s1; 

  foo(s1); 
  bar(s1); 
  foo("temporary"); 
  bar("temporary"); 
  String s4 = baz(); 

  std::vector<String> svec; 
  svec.push_back(s0); 
  svec.push_back(s1); 
  svec.push_back(baz()); 
  svec.push_back("good job"); 
}

本文給出我認為適合面試的答案,強調正確性及易實現(白板上寫也不會錯),不強調效率。某種意義上可以說是以時間(運行快慢)換空間(代碼簡潔)。

首先選擇數據成員,最簡單的 String 只有一個 char* 成員變量。好處是容易實現,壞處是某些操作的復雜度較高(例如 size() 會是線性時間)。為了面試時寫代碼不出錯,本文設計的 String 只有一個 char* data_成員。而且規定 invariant 如下:一個 valid 的 string 對象的 data_ 保證不為 NULL,data_ 以 '/0' 結尾,以方便配合 C 語言的 str*() 系列函數。

其次決定支持哪些操作,構造、析構、拷貝構造、賦值這幾樣是肯定要有的(以前合稱 big three,現在叫 copy control)。如果鉆得深一點,C++11的移動構造和移動賦值也可以有。為了突出重點,本文就不考慮 operator[] 之類的重載了。

這樣代碼基本上就定型了:

復制代碼 代碼如下:

#include <utility> 
#include <string.h> 

class String 

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

  String(const char* str) 
    : data_(new char[strlen(str) + 1]) 
  { 
    strcpy(data_, str); 
  } 

  String(const String& rhs) 
    : data_(new char[rhs.size() + 1]) 
  { 
    strcpy(data_, rhs.c_str()); 
  } 
  /* Delegate constructor in C++11 
  String(const String& rhs) 
    : String(rhs.data_) 
  { 
  } 
  */ 

  ~String() 
  { 
    delete[] data_; 
  } 

  /* Traditional: 
  String& operator=(const String& rhs) 
  { 
    String tmp(rhs); 
    swap(tmp); 
    return *this; 
  } 
  */ 
  String& operator=(String rhs) // yes, pass-by-value 
  { 
    swap(rhs); 
    return *this; 
  } 

  // C++ 11 
  String(String&& rhs) 
    : data_(rhs.data_) 
  { 
    rhs.data_ = nullptr; 
  } 

  String& operator=(String&& rhs) 
  { 
    swap(rhs); 
    return *this; 
  } 

  // Accessors 

  size_t size() const 
  { 
    return strlen(data_); 
  } 

  const char* c_str() const 
  { 
    return data_; 
  } 

  void swap(String& rhs) 
  { 
    std::swap(data_, rhs.data_); 
  } 

 private: 
  char* data_; 
};

注意代碼的幾個要點:

只在構造函數里調用 new char[],只在析構函數里調用 delete[]。
賦值操作符采用了《C++編程規范》推薦的現代寫法。
每個函數都只有一兩行代碼,沒有條件判斷。
析構函數不必檢查 data_ 是否為 NULL。
構造函數 String(const char* str) 沒有檢查 str 的合法性,這是一個永無止境的爭論話題。這里在初始化列表里就用到了 str,因此在函數體內用 assert() 是無意義的。
這恐怕是最簡潔的 String 實現了。

練習1:增加 operator==、operator<、operator[] 等操作符重載。

練習2:實現一個帶 int size_; 成員的版本,以空間換時間。

練習3:受益于右值引用及移動語意,在 C++11 中對 String 實施直接插入排序的性能比C++98/03要高,試編程驗證之。(g++的標準庫也用到了此技術。)

陳皓注:同時,大家可以移步看看我的一篇老文《STL中String類的問題

原文鏈接:http://coolshell.cn/articles/10478.html

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
高清欧美一区二区三区| 国产成人av网| 一区二区日韩精品| 成人性生交xxxxx网站| 国产999在线观看| 国产97在线视频| 国产精品丝袜一区二区三区| 97人洗澡人人免费公开视频碰碰碰| 综合网日日天干夜夜久久| 欧美老少做受xxxx高潮| 91久久嫩草影院一区二区| 日韩中文字幕在线播放| 97精品一区二区视频在线观看| 欧美日韩国产91| 国产ts一区二区| 亚洲精品日韩在线| 黄色一区二区在线观看| 9.1国产丝袜在线观看| 久久久久久久影院| 国产精品嫩草影院久久久| 欧美中文字幕视频在线观看| 国产亚洲欧美日韩美女| 中文字幕一区二区精品| 欧美性猛交xxxx黑人猛交| 亚洲色图35p| 国产精品中文字幕在线| 欧美成在线观看| 国内精品中文字幕| 中文字幕日韩在线播放| 亚洲美女av电影| 欧美午夜精品久久久久久人妖| 亚洲一二在线观看| 国产精品影院在线观看| 国产精品视频久| 成人写真视频福利网| 亚洲三级黄色在线观看| 亚洲精品在线91| 日韩精品中文在线观看| 国产欧美在线看| 中文字幕免费国产精品| 伊人久久久久久久久久久| 国产在线视频2019最新视频| 5566日本婷婷色中文字幕97| 欧美色视频日本版| 国产视频精品免费播放| 亚洲高清免费观看高清完整版| 精品国产欧美一区二区五十路| 精品毛片网大全| 国产噜噜噜噜久久久久久久久| 亚洲国产天堂久久综合| 色妞在线综合亚洲欧美| 在线国产精品视频| 久久九九有精品国产23| 亚洲色图35p| 亚洲免费精彩视频| 97人人模人人爽人人喊中文字| 国产精品h片在线播放| 亚洲男人天堂古典| 成人av电影天堂| 久久视频在线免费观看| 亚洲高清一二三区| 成人黄色在线播放| 国产精品自拍视频| 午夜精品久久久久久久久久久久| 日本国产欧美一区二区三区| 久久久久久久色| 91亚洲va在线va天堂va国| 在线观看欧美成人| 91精品国产自产在线| 国产精品av在线播放| 亚洲男人天堂视频| 日韩在线免费视频观看| 欧美激情视频一区二区| 国产亚洲一区二区精品| 高清一区二区三区日本久| 欧美视频中文在线看| 少妇久久久久久| 国产精品一久久香蕉国产线看观看| 亚洲国产精品成人av| 日韩欧美国产激情| 欧美电影免费看| 一区二区三欧美| 亚洲精品免费av| 亚洲精品久久久久久久久久久久久| 欧美性受xxx| 不卡av电影在线观看| 国内免费久久久久久久久久久| 正在播放国产一区| 精品国产老师黑色丝袜高跟鞋| 一本色道久久88综合亚洲精品ⅰ| 久久久久久久久国产| 国产精品嫩草视频| 91国产在线精品| 久久久精品一区| 午夜精品视频在线| 黄色成人av在线| 68精品久久久久久欧美| 欧美精品午夜视频| 久久91精品国产| 亚洲sss综合天堂久久| 91香蕉嫩草神马影院在线观看| 精品国偷自产在线| 色www亚洲国产张柏芝| 九九热这里只有精品6| 欧美激情奇米色| 欧美日韩国产精品专区| 日韩中文字幕视频在线观看| 日韩美女免费线视频| 91av视频在线| 国产一区二区黄| 久久国产精品久久精品| 色悠悠久久久久| 亚洲欧美国产一本综合首页| 成人性生交大片免费看视频直播| 欧美电影在线观看高清| 国产精品日韩久久久久| 国内精品久久影院| 亚洲一区二区中文字幕| 国产成人综合精品| 欧美激情久久久久久| 91成人在线观看国产| 亚洲最大福利视频网| 日韩av手机在线观看| 欧美激情视频给我| 亚洲福利视频在线| 亚洲精品久久久久中文字幕欢迎你| 中文字幕亚洲国产| 日本亚洲欧美成人| 欧美成人激情视频免费观看| 午夜免费日韩视频| 国产亚洲欧美日韩美女| 久久成年人视频| 久久成人av网站| 国产在线视频不卡| 国产日韩在线精品av| 日韩欧美国产中文字幕| 国产+成+人+亚洲欧洲| 伊人男人综合视频网| 这里只有精品视频| 成人国产在线视频| 国产精品成久久久久三级| 中文字幕在线国产精品| 成人免费视频xnxx.com| 国产一区二区三区日韩欧美| 国产日本欧美视频| 国产精品一区二区久久久| 中文字幕日韩欧美精品在线观看| 日产精品久久久一区二区福利| 欧美高清一级大片| 久久青草福利网站| 在线日韩精品视频| 欧美成人精品一区二区| 欧美视频在线免费看| 亚洲精品视频在线播放| xxx欧美精品| 久久亚洲精品小早川怜子66| 欧美成人精品一区| 91精品久久久久久| 疯狂做受xxxx欧美肥白少妇| 在线视频一区二区| 欧洲成人性视频| 欧美黑人一区二区三区| 中文字幕在线观看日韩| 欧美午夜美女看片|