2015-07-12 99 views
1
#include <iostream> 

void test(std::string &s) { 
    std::string p = s; 
    std::cout << p.length() << " " << p; 
} 

int main() { 
    std::string s = "Hello world"; 
    test(s); 

    return 0; 
} 

所以,功能test從我main函數接收到我的字符串s參考。當我在C++中爲對象賦值時,會發生什麼?

我的問題是,什麼方面做:

std::string p = s;

是否淺複製引用,並把它放在p,從而擊敗首先使用參考的目的是什麼?

還是(p)只是作爲參考?

+2

的_lvalue_的拷貝構造函數將被調用,如果它是一個_shallow copy_取決於它的實現。目前還不清楚你究竟在問什麼。 –

+0

如果寫入時複製字符串被禁用,它將執行深層複製 – James

+2

忘記「淺」或「深」複製。它只是複製引用引用的對象。複製的語義是爲被複制的對象的類型定義的(在這種情況下,是'std :: string'。) – juanchopanza

回答

2

它創建的參考值的副本,它不會讓你與p編輯s的內容,使p充當參考,並能夠從p編輯s,你必須申報它作爲參考:

std::string& p = s; 
+0

換句話說,在這方面,'std :: string'的行爲與'int'相同。這是關於C++的好處之一,就是這種一致性。 'int p = i'會創建一個新的'int',用'i'的副本初始化,因此提問者不應該期待'std :: string p = s'有任何不同。 –

1

從而擊敗首先使用參考的目的是什麼?

爲什麼它失敗了引用的目的,你已經聲明s作爲參考,不是嗎?不是p。所以正如指出的那樣,它會複製s包含的值。

1

當我在C++中爲一個對象賦值時,會發生什麼?

你不能指定參考值,或者至少你不應該這樣認爲。引用不是一個指針。會發生什麼是您分配一個對象的值,因爲引用是對象,通過不同的名稱訪問。

void test(std::string &s) { 

,你是在處理一個參考的事實是,在聲明的時候才真正重要。此函數中使用s的所有代碼使用std::string,而不是std::string &

我的問題是,這是什麼做行:

std::string p = s; 

它賦予你的std::string對象p,沒有更多,不會少。換句話說,它同樣的,因爲它會在這個方案:

int main() { 
    std::string s = "Hello world"; 

    std::string &s_with_different_name = s; 
    std::string p = s_with_different_name; 
    std::cout << p.length() << " " << p; 
} 

或者更簡單地說,在這樣的:

int main() { 
    std::string s = "Hello world"; 

    std::string p = s; 
    std::cout << p.length() << " " << p; 
} 
相關問題