C++的三種傳遞參數到函數的方法:按值傳遞,用引用參數按引用傳遞,用指針參數按引用傳遞

平時見的較多的是按值傳遞(pass-by-value)和按引用傳遞(pass-by-reference)
這兩種函數的形參傳遞方式.

pass-by-value:當用這種方式傳遞形參時,會在函數調用的堆棧上,產生一份實參值的副本,然後將副本傳遞給被調用的函數,對副本的修改不影響調用者中原始變量的值。

pass-by-reference:當用這種方式傳遞形參時,調用者使得被調用函數可以直接訪問調用者的數據,並且如果被調用函數需要,還可以修改這些數據。

按引用傳遞,分爲用引用參數和用指針參數。

於是先用例子說明

#include <iostream>
using namespace std;
class M
{
public:
	M(int i, int j) { x=i; y=j; }
 	void setxy(int i, int j)
	{
		x=i;
		y=j;
	}
 	void print() 
	{
		cout<<x<<","<<y<<endl; 
	}
private:
	int x, y;
};

void fun(M m1, M &m2, M *m3) 
{
	M *p3 =&m1;
	M *p4 =&m2;
	M *p5 = m3;
	cout<<"按值傳遞的地址 *p3="<<static_cast<const void *>(p3)<<endl;				//按值傳遞的地址
	cout<<"用引用參數按引用傳遞的地址 *p4="<<static_cast<const void *>(p4)<<endl;	//用引用參數按引用傳遞的地址
	cout<<"用指針參數按引用傳遞的地址 *p5="<<static_cast<const void *>(p5)<<endl;	//用指針參數按引用傳遞的地址
	m1.setxy(12, 15);
	m2.setxy(22, 25);
	(*m3).setxy(32, 35);
}

void main()
{
	M p(5, 7), q(6,8), z(7,9);
	M *pp = &z;
	M *p1 = &p;
	M *p2 = &q;
	cout<<"按值 *p1="<<static_cast<const void *>(p1)<<endl;
	cout<<"用引用參數 *p2="<<static_cast<const void *>(p2)<<endl;
	cout<<"用指針參數 *pp="<<static_cast<const void *>(pp)<<endl;
	fun(p, q, pp);
	p.print();
	q.print();
	z.print();
}
結果可想而知,p的成員值依舊是(5,7),而q和z都更改爲set後的值。


還有就是引用參數與指針作參數的區別?

1:
指針通過對地址的操作進而改變實參,
引用是以別名的方式對實參的直接處理達到同樣效果。

2:

引用肯定會指向一個對象,引用應被初始化,而指針可以是NULL:

string& rs; // 錯誤,引用必須被初始化
string s("xyzzy");
string& rs = s; // 正確,rs指向s

指針沒有這樣的限制。

string *ps; // 未初始化的指針

                  // 合法但危險


3:

不存在指向空值的引用這個事實意味着使用引用的代碼效率比使用指針的要高。因爲在使用引用之前不需要測試它的合法性

void printDouble(const double& rd)
  {
   cout << rd; // 不需要測試rd,它
  }       // 肯定指向一個double值


相反,指針則應該總是被測試,防止其爲空:

void printDouble(const double *pd)
  {
   if (pd)
   {// 檢查是否爲NULL
    cout << *pd;
   }
  }

4:

指針可以被重新賦值以指向另一個不同的對象,但引用則總是指向在初始化時被指定的對象,以後不能改變。

string s1("Nancy");
string s2("Clancy");

string& rs = s1; // rs 引用 s1
string *ps = &s1; // ps 指向 s1
rs = s2; // rs 仍舊引用s1
       // 但是 s1的值現在是"Clancy"

ps = &s2; // ps 現在指向 s2;// s1 沒有改變

總的來說,當使用指針,一是考慮到存在不指向任何對象的可能(在這種情況下,你能夠設置指針爲空),二是需要能夠在不同的時刻指向不同的對象(在這種情況下,能改變指針的指向)。如果總是指向一個對象並且一旦指向一個對象後就不會改變指向,那麼應該使用引用。


利用Vector

#include <iostream>
#include <vector>
using namespace std;

int main()
{
	vector<int> v(7); //建立整形向量(vector),大小爲7
	v[5] = 10; // 這個被賦值的目標對象就是操作符[]返回的值
	cout<<"vector<int> v<7>:"<<endl;
	for (int i =0;i!=v.size();i++)
	{
		cout<<v[i]<<" ";
	}
	cout<<endl;
	int j =10;
	v[5]=j;
	cout<<"v[5]= "<<v[5]<<endl;
	j=10;
	cout<<"v[5]= "<<v[5]<<endl;
	cout<<"vector<int*>"<<endl;
	vector<int*> pv(7);
	int i =10;
	pv[5]=&i;
	cout<<"pv[5]= "<<*pv[5]<<endl;
	i = 5;
	cout<<"pv[5]= "<<*pv[5]<<endl;
	return 0;
}


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