//本程式研究怎樣進行對函數傳回值操作而不影響實參,以及怎樣讓對函數傳回值的操作影響到實參的值
//以及怎麼禁止對函數傳回值進行操作的幾種方法。
#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的時候,這樣任何試圖對傳回值的操作都將導致編譯失敗。如果既要對傳回值進行操作,又要
操作結果不影響實參,可以使用傳值的方式。
*/