2014-02-07 50 views
1
Person(const string &name) 
{ 
    mName=name; 
} 


Person(string name) 
{ 
    mName=name; 
} 

MNAME是一個私有成員變量常量字符串和名稱和字符串名稱構造對於C之間不同++

所以我做了一個名爲Person類。我想知道什麼是const字符串&名稱和字符串名稱之間的區別。我試圖把字符串&名稱,但它給了我一個錯誤消息。

我知道&是一個參考,所以幾乎就像一個地址?我猜的const是需要的,因爲參考是一個常量?另外,爲什麼不只是字符串&名稱的工作?

這是我

候選構造函數(隱含的拷貝構造函數) 不可行的錯誤消息:從「爲const char [4]」到「const的人」 沒有已知轉換爲第一個參數

候選構造並不可行:沒有已知的從轉換 '爲const char [4]' 到 '串&'(又名 'basic_string的,分配器> &'),用於第一參數 人(串&名)

+0

發佈它在嘗試使用非const引用時給出的錯誤消息。 – Yuushi

+0

錯誤消息與mName的數據類型有關。你使用了哪些數據類型,你可以發佈完整的代碼嗎? – vathsa

回答

0

& name是一個引用,這意味着它只是您作爲參數傳入的字符串的另一個名稱。這允許你傳入對象本身,而不僅僅是它的值。如果你想傳入一個const,你必須使用const。常量不能被修改。

0

&名稱是對名稱的引用,所以實際的對象作爲參數傳遞,而不是副本。當你把常量字符串&名稱,名稱仍然作爲參考傳遞,但常量使得它不能改變實際的對象,只是使用它。

0

const string &namestring name之間的不同之處在於,const string &name是恆定的參考,在這裏,當你將它傳遞給函數不創建另一個副本,一個字符串也不能在函數內部改變,因爲它是恆定的。

3

選項#1 - 通過值傳遞參數,與Person(string name)

  1. string構造函數被調用,並且在堆棧上創建臨時string實例。

  2. Person構造函數被調用。

  3. string使用臨時實例調用析構函數。

選項#2 - 按引用傳遞參數,用Person(const string& name)

  1. string實例(其4字節或8字節的地址)的參考被放置在堆棧。

  2. Person構造函數被調用。

正如你所看到的,選項#2通常更有效。

的編譯錯誤大概是像Person x("abc")結果:一個Person構造這需要明確的類型要傳遞參數的

編譯器首先搜索。在這種情況下,它是Person(const char[]),您尚未定義。

然後,編譯器搜索採用「可轉換」類型的任何其他Person構造函數。由於operator const string&(const char[])存在,編譯器可以將參數​​從const char[]轉換爲const string&。因此,如果您定義了Person(const string& name),那麼您的代碼已成功編譯。

最後,編譯器解釋了你定義的每個Person構造函數,爲什麼它不適合你的調用。在這種情況下,它會告訴您沒有operator string&(const char[]),允許它在調用您的Person(string&)構造函數之前將參數​​從const char[]轉換爲string&