對函數傳回值的操作是否改變實參的討論

來源:互聯網
上載者:User

//本程式研究怎樣進行對函數傳回值操作而不影響實參,以及怎樣讓對函數傳回值的操作影響到實參的值
//以及怎麼禁止對函數傳回值進行操作的幾種方法。

#include<iostream>
using std::cout;
using std::cin;
using std::endl;

inline int &max1(int a,int b)
{
 return a<b? b:a;
}

inline int  &max2(int &a ,int &b)

 return a<b? b:a;
}

inline int  &max3(const int &a,const int &b)
{
 return a<b? b:a;
}

inline int * max4(int *a ,int *b)

 return *a<*b? b:a;
}

inline  const int * max5(int *a , int *b)

 return *a<*b? b:a;
}

inline const int  &max6(int &a ,int &b)

 return a<b? b:a;
}

 

void main()
{
 int a=1,b=2,c=3,d=4;
 int *p1=&a,*p2=&b,*p3=&c,*p4=&d;

 cout<<"a,b調用函數++max1前a="<<a<<"/tb="<<b<<endl;
 cout<<"++max1(a,b)本身的值為"<<++max1(a,b)<<endl;
 cout<<"a,b調用函數++max1後a="<<a<<"/tb="<<b<<endl;
//對次函數max1的調用結果說明當參數傳遞為傳值時,即使返回的是指標和引用,對傳回值的操作也不會影響到
//原來的參數
    cout<<"a,b調用函數++max2前a="<<a<<"/tb="<<b<<endl;
 cout<<"++max2(a,b)本身的值為"<<++max2(a,b)<<endl;
    cout<<"a,b調用函數++max2後a="<<a<<"/tb="<<b<<endl;
//對此函數max2的調用結果說明當參數和傳回值都是引用的時候,對傳回值的操作將改變實參的值
    cout<<"c,d調用函數++max3前c="<<c<<"/td="<<d<<endl;
    cout<<"++max3(c,d)本身的值為"<<++max3(c,d)<<endl;
    cout<<"c,d調用函數++max3後c="<<c<<"/td="<<d<<endl;
//原來以為將max3的兩個形參聲明為const的引用,即使返回的是引用,對傳回值的操作就不能改變實參
//但是結果確實改變了實參d的值,猜測原因就是對實參是引用的限制只在實參的那個範圍裡面有效,也就是
//說只在函數體和那個實參列表中是const的引用,當函數返回以後對傳回值操作不受const的限制了。因為對
//引用的說明就是在參數裡聲明的。
    cout<<"p1,p2調用函數++(*max4(p1,p2))前a="<<*p1<<"/tb="<<*p2<<endl;
 cout<<"++(*max4(p1,p2))本身的值為"<<++(*max4(p1,p2))<<endl;
    cout<<"p1,p2調用函數++(*max4(p1,p2))後a="<<*p1<<"/tb="<<*p2<<endl;
//本段程式說明當參數和傳回值都是指標的時候,對傳回值的操作將改變實參的值
 /*  
    cout<<"p1,p2調用函數++(*max5(p1,p2))前a="<<*p1<<"/tb="<<*p2<<endl;
 cout<<"++(*max5(p1,p2))本身的值為"<<++(*max5(p1,p2))<<endl;
    cout<<"p1,p2調用函數++(*max5(p1,p2))後a="<<*p1<<"/tb="<<*p2<<endl;
*/
//上面這段程式不能通過編譯,因為*max5(p1,p2)返回的是一個const 指標,不能被修改。

 /*   cout<<"a,b調用函數++max6前a="<<a<<"/tb="<<b<<endl;
 cout<<"++max6(a,b)本身的值為"<<++max6(a,b)<<endl;
    cout<<"a,b調用函數++max6後a="<<a<<"/tb="<<b<<endl;
*/
//上面的這段程式也不能被編譯,因為max6(a,b)返回的是一個const引用,不能被修改。
}
   
/*總結:(1)本程式使用了inline函數,以前都一直以為inline只可以用做類的成員函數
        (2)通過本函數驗證了只有在一種情況下對函數傳回值的操作會影響到實參
   1。參數是引用或指標(這個引用和指標可以是const的),傳回值是引用或指標(這個引用或指標絕對
      不能為const的),要同時滿足這兩個條件才可以。
  (3)要避免對傳回值的操作影響到實參,只要避免(2)的兩個條件即可,尤其有效是將傳回值聲明為
        const的時候,這樣任何試圖對傳回值的操作都將導致編譯失敗。如果既要對傳回值進行操作,又要
     操作結果不影響實參,可以使用傳值的方式。
 */ 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.