標籤:

【源碼眾讀】之問題解答,Part_8

問題1

n

// This prevents Json(some_pointer) from accidentally producing a bool. Use n// Json(bool(some_pointer)) if that behavior is desired. nJson(void *) = delete;n

n

疑問

n

=delete的作用是什麼?

n

解題思路

n

還是翻書,查找目錄和c++11新特性目錄,找到15.7.2 刪除的拷貝控制和繼承 P553。翻到這一頁,書上又指明了,P450和P475已經出現過這部分內容。我們從P450看起。

n

解答

n

阻止拷貝

n

雖然大多數類應該定義拷貝構造函數和拷貝賦值運算符,但對某些類來說,這些操作沒有合理的意義。在些情況下,定義類時必須採用某種機制阻止拷貝或賦值。

n

為了阻止拷貝,看起來可能應該不定義拷貝控制成員。但是,這種策略是無效的:如果我們的類未定義這些操作,編譯器會為它生成合成的版本。

n

因此,在新標準中,我們通過=delete來解決這一問題。

n

通過將拷貝構造函數和拷貝賦值運算符定義為刪除的函數來阻止拷貝。刪除的函數是這樣一種函數:我們雖然聲明了它,但不能以任何方式使用它。

n

在函數參數列表後面加上=delete來指出我們希望將它定義為刪除的函數

n

Json(void *) = delete;n

n

=delete告訴編譯器,我們不希望定義這些成員。

n

不能把析構函數聲明為刪除的函數。如果析構函數被刪除,就無法銷毀此類型的對象了。因此,編譯器將不允許定義該類型的變數或創建該類的臨時對象

n

參考資料

n

《c++ Primer》P450

n

n

問題2

n

void dump(std::string &out) const; nstd::string dump() const { n std::string out; n dump(out); n return out; n}n

n

疑問

n

這裡對dump的結果提供了兩種返回形式,可以在實際編程中借鑒。

n

std::string dump() const {}是內聯的,在編譯時展開

n

dump是使用頻率很高的函數,使用兩種形式返回結果對用戶來說比較方便。

n

那麼對比使用頻率沒那麼高的函數,有沒有必要定義兩種形式返回結果呢?

n

我覺得是沒有必要的。大家可以留言討論

n

問題3

n

const char * in; nstd::string(in);n

n

疑問

n

不大記得了,string的其他構造?

n

解題思路

n

翻看以前的筆記

n

解答

n

初始化string對象的方式

n

string s1; nnstring s2( s1 ); nstring s2 = s1; nnstring s3("value"); nstring s3 = "value"; nnstring s4( n, c )n

n

數組還可以用來初始化vector對象,只需要指明待拷貝區域的首尾元素地址就可以了

n

int arr[] = { 0, 1, 2, 3 }; nvector<int> ivec( begin(arr), end(arr) );n

n

建議:盡量使用vector和string,而非數組。數組和指針容易產生一些概念和理解上的錯誤

n

n

上面用數組來初始化vector的機制,有助於我們用vector來代替數組

n

那麼,字元數組能否轉換成string呢

n

允許使用以空字元結束的字元數組來初始化string對象或為string對象賦值

n

當然,如果需要也可以把string對象轉換為指向字元的指針

n

const char *str = s.c_str();n

n

參考資料

n

筆記

n

問題4

n

static inline std::vector<Json> parse_multi( n const std::string & in, n std::string & err, n JsonParse strategy = JsonParse::STANDARD) { n std::string::size_type parser_stop_pos; n return parse_multi(in, parser_stop_pos, err, strategy); n}n

n

疑問

n

std::string::size_type parser_stop_pos;默認初始化得到的值是多少?

n

為什麼使用std::string::size_type類型

n

解題思路

n

查看cppreference,沒有得到解答

n

std::basic_string - cppreference.com

n

n

百度得到stackoverflow上的一個答案

n

string::size_type instead of int

n

n

解答

n

string::size_type是一個unsigned類型,parser_stop_pos默認初始化得到的值應當是0

n

至於為什麼使用std::string::size_type類型,翻譯stackoverflow上的一個答案如下:

n

shot和signed char都可以存放數字。但是當遇到一個超長的string時,他們的位數限制了他們所能表示的最大數字,以至於無法存放一個超長string的size。

n

但是string::size_type不同,無論string有多長,string::size_type都能存放其長度

n

舉例說明為什麼string::size_type是必要的:考慮一個64位的機器,int所佔有的位數通常還是32bit,但是實際上你的內存所能存儲的內容遠遠不止2的32次方bytes那麼多。

n

所以如果使用int來表示string的長度,就沒有辦法創建一個長度大於2的31次方的string了。

n

但是string::size_type在64位的機器上是一個64bit的值,所以可以毫無問題的用來表示string的長度

n

n

參考資料

string::size_type instead of int


推薦閱讀:

《C++ Primer》讀書筆記-第十二章 03 使用標準庫 part2
《C++ Primer》讀書筆記-第七章 04 類的作用域
我的CUDA學習之旅2——圖像形態學腐蝕、膨脹CUDA實現

TAG:C |