函數返回值爲引用、非引用及引用左值的情況

返回非引用

      string make_plural(size_t i,const string &word,const string &ending)
      {
             return (i==1)?word:word+ending;
      }

      以上函數,當i等於1時,函數返回word形參的副本;當i不等於1時函數返回一個臨時的string對象,這個臨時對象是由字符串word和ending相加而成的。這兩種情況下,return都在調用該函數的地方防複製了返回的string對象。

返回引用

      const string &shorterString(const string &s1,const string &s2)
      {
             return s1.size()<s2.size()?s1:s2;
      }

      以上函數的返回值是引用類型。無論返回s1或是s2,調用函數和返回結果時,都沒有複製這些string對象。

千萬不要返回局部對象的引用

      const string &mainip(const string &s)
      {
             string ret=s;
             return ret;
      }
      
      當函數執行完畢,程序將釋放分配給局部對象的存儲空間。此時,對局部對象的引用就會指向不確定的內存。(我在dev c++裏運行通過。。。。 但是vc6和vc2008不能編譯通過)。同理,也不能返回局部對象的指針。
      

引用返回左值(比較奇妙)

      char &get_val(string &str,string::size_type ix)
      {
             return str[ix];
      }

      使用語句調用:
       string s("123456");
       cout<<s<<endl;
       get_val(s,0)='a';
       cout<<s<<endl;

      把函數應用於左值,比較特殊。

另外,可仔細閱讀此博文:http://blog.csdn.net/sxhelijian/article/details/7466540

ref:http://www.cppblog.com/liujiajia/archive/2008/07/16/56244.html

還有,關於左值的問題和參考如下博文:

左值和右值

我們在看書的時候,經常可以看到關於 左值(L-value) 和 右值(R-value) 的概念,那麼到底什麼是左值,什麼是右值,它們之間的區別又是在哪裏呢?

    通俗的講,左值就是能夠出現在賦值符號左面的東西,而右值就是那些可以出現在賦值符號右面的東西了。

舉個很簡單的例子:

a=b+100;

那麼這裏a就是左值,b+25就是一個右值。左值和右值之間是不一定都能互換的,上面的這個例子就是不能互換的,如果寫成

b+100=a;

大家都能看出來這樣寫會不編譯通過的,因爲編譯器無法判斷b+100的內存地址,所以不能操作。

看了這個例子,可以做一個總結,左值必須應該是一個變量或者是表達式等,但是它的物理位置是可以確定的,而右值不一定,這也是它們兩者之間的區別。

關於左值是表達式的例子有數組,還有指針這些都可以。

int array[10];

int a=5;

array[a+3]=10; //這裏左值就是一個數組表達式了

 

此文完。

 

 另外:liotta朋友給了一些其他方面的提示 (左值右值翻譯可能有些問題)

錯了,沒有什麼左值和右值!
翻譯害人不淺,
L-value中的L指的是Location,表示可尋址。The "l" in lvalue can be though of as location
R-value中的R指的是Read,表示可讀。The "r" in rvalue can be thought of as "read" value. 

ref:http://www.cppblog.com/cc/archive/2008/06/07/7619.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章