2011-02-04 36 views
2
const std::string s1("foo"); 
const std::string& s2("foo"); 

不知道他們是如何不同,但我看到兩種用法的證據。有任何想法嗎?這兩個局部變量有什麼區別?

+1

這個問題實際上是關於什麼的?你從未聽說過有關參考?或者你真的知道什麼是引用,但從來沒有看到一個參考初始化的方式?在前一種情況下,你需要先閱讀一些關於C++的書。試圖通過詢問關於不熟悉的語法的問題來學習該語言的基本特徵並不完全是一種有效的方法。 – AnT 2011-02-04 17:36:59

+0

@AndreyT我對語言比較陌生,但我很想知道這兩個實例之間有什麼微妙之處。根據我的經驗,我至少沒有遇到第二個例子,並且對它的使用感到疑惑。 – chriskirk 2011-02-04 17:44:29

+0

無用的瑣事:當前C++語言標準中存在一個缺陷,它聲明只有對象可以是變量。由於's2`是一個引用,而不是一個對象,它在技術上不是一個變量。這個缺陷在即將出版的C++語言標準C++ 0x中得到解決。 – 2011-02-04 17:47:31

回答

6
const std::string s1("foo"); 

聲明一個名爲std::string對象作爲一個局部變量。

const std::string& s1("foo"); 

這聲明瞭對std::string對象的const引用。使用內容"foo"創建一個未命名的臨時std::string對象,並將引用綁定到該臨時對象。臨時對象將存在,直到參考超出範圍。

在這種特殊情況下,兩者之間沒有明顯的區別:在你結束了,可以通過名字s1進行訪問,當s1超出範圍時將被摧毀了std::string這兩種情況。

但是,在某些情況下,存在差異。舉個例子,通過引用返回的函數:

const std::string& get_reference_to_string(); 

如果你調用這個函數的結果初始化s1,之間是有區別:

const std::string s1(get_reference_to_string()); 
const std::string& s1(get_reference_to_string()); 

在第一種情況下,引用字符串的副本被製作並用於初始化s1。在第二種情況下,s1簡單地綁定到std::string,返回的引用指的是:不做任何複製。

0

第一個實例創建一個初始化爲「foo」的常量字符串變量。第二個創建一個字符串的常量引用,然後初始化該常量引用以指向已初始化爲保存「foo」的臨時字符串。

0

const std::string s1("foo");在堆棧上創建一個std::string對象,並使用const char*字符串「foo」對其進行初始化。另一方面,const std::string& s1("foo")const參考到隱式構造的std::string

3

由於常量引用可以綁定到臨時對象以及具有從char *隱式轉換的字符串,它們的含義是相同的。

爲了清晰和易讀,更喜歡非參考。