C++:向函數傳遞對象(對象、對象指針、對象引用)


3.5.1   使用對象作為函數參數,其方法與傳遞基本類型的變量相同 

//例3.21 使用對象作為函數參數
#include<iostream>
using namespace std;
class A{
 public:
       A(int n)
       {
        t = n;
       }
       void set_i(int n)
       {
        t = n;
       }
       int get_i()
       {
        return t;
       }
 private:
       int t;       
};
void sqrt_it(A obj2)  //對象obj2作為函數sqrt_it的形參,接收傳來的實參對象obj1 
{
       obj2.set_i(obj2.get_i()*obj2.get_i());
       cout<<"在函數sqrt_it內,形參對象的obj2的數據成員t的值為:"<<obj2.get_i();
       cout<<endl;
}
int main()
{
       A obj1(10);
       cout<<"調用函數sqrt_it前,實參對象obj1的數據成員t的值為:"<<obj1.get_i();
       cout<<endl;
       sqrt_it(obj1);  //調用函數sqrt_it,實參obj1傳給形參obj2 
       cout<<"調用函數sqrt_it后,實參對象obj1的數據成員t的值為:"<<obj1.get_i();
       cout<<endl;
       return 0; 
}
/*
程序運行結果如下:
 調用函數sqrt_it前,實參對象obj1的數據成員t的值為:10
 在函數sqrt_it內,形參對象obj2的數據成員t的值為:100
 調用函數sqrt_it后,實參對象obj1的數據成員t的值為:10
*/ 

3.5.2  使用對象指針作為函數參數,可以實現"傳址調用"

//例3.22  使用對象指針作為函數參數
#include<iostream>
using namespace std;
class A{
 public:
       A(int n)
       {
        t = n;
       }
       void set_i(int n)
       {
        t = n;
       }
       int get_i()
       {
        return t;
       }
 private:
       int t;       
};
void sqrt_it(A *obj2)  //對象指針obj2作為函數sqrt_it的形參,接收傳來的實參對象obj1地址 
{                      //也即指針obj2指向存放在obj1的地址內的值 
        obj2->set_i(obj2->get_i()*obj2->get_i());
     //(*obj2).set_i((*obj2).get_i()*(*obj2).get_i());
       cout<<"在函數sqrt_it內,形參對象的obj2的數據成員t的值為:"<<obj2->get_i();
       cout<<endl;
}
int main()
{
       A obj1(10);
       cout<<"調用函數sqrt_it前,實參對象obj1的數據成員t的值為:"<<obj1.get_i();
       cout<<endl;
       sqrt_it(&obj1); //調用函數sqrt_it,將實參對象obj1的地址傳給形參指針變量obj2
       cout<<"調用函數sqrt_it后,實參對象obj1的數據成員t的值為:"<<obj1.get_i();
       cout<<endl;
       return 0; 
}
/* 
程序運行結果如下:
 調用函數sqrt_it前,實參對象obj1的數據成員t的值為:10
 在函數sqrt_it內,形參對象的obj2的數據成員t的值為:100
 調用函數sqrt_it后,實參對象obj1的數據成員t的值為:100
*/ 

3.5.3  使用對象引用作為函數參數(兼具對象指針的優點,而且更簡單、更直接) 

//例3.23 使用對象引用作為函數的參數
 #include<iostream>
using namespace std;
class A{
 public:
       A(int n)
       {
        t = n;
       }
       void set_i(int n)
       {
        t = n;
       }
       int get_i()
       {
        return t;
       }
 private:
       int t;       
};
void sqrt_it(A &obj2)  //對象obj2作為函數sqrt_it的形參,用obj2引用對象obj1 
{
       obj2.set_i(obj2.get_i()*obj2.get_i());
       cout<<"在函數sqrt_it內,形參對象的obj2的數據成員t的值為:"<<obj2.get_i();
       cout<<endl;
}
int main()
{
       A obj1(10);
       cout<<"調用函數sqrt_it前,實參對象obj1的數據成員t的值為:"<<obj1.get_i();
       cout<<endl;
       sqrt_it(obj1);  //調用函數sqrt_it,實參obj1傳給形參obj2 
       cout<<"調用函數sqrt_it后,實參對象obj1的數據成員t的值為:"<<obj1.get_i();
       cout<<endl;
       return 0; 
}
/*
程序運行結果如下:
 調用函數sqrt_it前,實參對象obj1的數據成員t的值為:10
 在函數sqrt_it內,形參對象的obj2的數據成員t的值為:100
 調用函數sqrt_it后,實參對象obj1的數據成員t的值為:100 
*/

總結:

1、使用對象作為函數參數,形參和實參是不同的對象,它們所占地址空間不同,因此,形參
的改變,並不影響實參的值。
2、使用對象指針作為函數參數中,所謂"傳址調用",就是在函數調用時使實參對象和形參對象
的地址傳遞給函數,形參和實參都指向同一個地址值,此時在函數中對形參對象的修改將影
響調用該函數的實參對象本身。
3、使用對象引用作為函數的參數,所謂"對象引用",就是對實參對象換了個別名,實際上它們
仍是同一個對象,所以,所謂的形參(別名對象)值的的改變,直接就是實參對象值的改變。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM