標籤:++ stream 複合 佔用 函數調用 class name 變數 表示
*是取值運算子,對地址使用可以獲得地址中儲存的數值;對於指標a,*a表示取a中的值&是地址運算子,對變數使用可以獲得該變數的地址。 對於變數b,*b表示取b的地址
別名(引用):主要用於做函數的形式參數。
引用是複合類型,通過在變數前添加&符號來定義。不能定義參考型別的引用!!除了作為形參,定義引用時必須初始化!!如:
int ival= 1024;int&ref = ival;int&ref1; error 未關聯int&ref2 = 10; error,必須關聯到一個對象ps:不能將引用再綁定到另一個對象!! const引用是指向const對象的引用,可以讀取但不能修改const引用。constint ival = 1024;int i =10;constint &ref = ival;constint &r = 42; right!不同於普通引用!constint &r2 = r+i; right!不同於普通引用!int&ref2 = ival; error!普通引用!非const引用只能綁定到與該引用同類型的對象。doubledval = 3.14;int&ri = dval;上述代碼會被編譯器解釋為:doubledval = 3.14;int temp= dval;int&ri = temp;所以改變ri不會修改dval,而是修改了temp。所以建議給ri加上const,即const int &ri=dval;
參數傳遞分為:值傳遞,指標傳遞,引用傳遞
#include "stdafx.h"#include <iostream>
using namespace std;//值傳遞void swap1(int p,int q) //傳過來的參數複製一份副本,所以造作對傳過來的參數沒有影響{ int temp; temp=p; p=q; q=temp;} //很明顯,交換失敗//指標傳遞,函數體內只有指標值的變化void swap2(int *p,int *q) //把指標存的是地址,所以調用時要傳對象的地址{ int temp; temp=*p; //把p(*指標是取指標指向地址的值)的值賦給temp *p =*q; //把q的值賦給p *q=temp; //再把temp的值賦給*q} //交換成功,實際是對指標指向地址的值的操作,p和q的指標並沒有改變//指標傳遞,函數體內只有指標的變化void swap3(int *p,int *q){ int *temp; //指標 temp=p; //把p的指標(指向的地址),賦給temp p=q; //把q的指標複製給p q=temp; //再把temp指標賦值給q} //交換失敗,雖然p=2,q=1.但是只是把p和q的指標值改變了,即p指向b,q指向a了,實際上a和b的值並沒有改變//引用傳遞,這時函數並沒有對形參對象初始化,即沒有指定形參對象是哪個對象的別名。
//在函數調用時,實參對象名傳給形參對象名,形參對象名就成為實參對象名的別名。
//實參對象和形參對象代表同一個對象,所以改變形參對象的值就是改變實參對象的值。
//實際上,在虛實結合時是把實參對象的地址傳給形參對象,使形參對象的地址取實參對象的地址,從而使形參對象和實參對象共用同一個單元。這就是地址傳遞方式。
//通過使用引用參數,一個函數可以修改另外一個函數內的變數。因為引用對象不是一個獨立的對象,不單獨佔用記憶體單元,而對象指標要另外開闢記憶體單元(其內容是地址),所以傳引用比傳指標更好。
//注意:雖然系統向形參傳遞的是實參的地址而不是實參的值,但實參必須使用對象名。
void swap4(int &p,int &q) //引用傳遞時,對形參的操作等同於對實參的操作,即傳遞的不會是實參的副本,而就是實參{ int temp; temp=p; p=q; q=temp;}int main(){ int a=1,b=2; swap1(a,b); //swap2(&a,&b); //swap3(&a,&b); //swap4(a,b); return 0;}
C++參數傳遞