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、使用對象引用作為函數的參數,所謂"對象引用",就是對實參對象換了個別名,實際上它們
仍是同一個對象,所以,所謂的形參(別名對象)值的的改變,直接就是實參對象值的改變。