引數傳遞:
形參(parameter)和實參(argument):
int num (
int a,
int b)
;int num (
int a,
int b)
//在函式的宣告或者定義裡,由由0個或多個形參組成的列表。
intmain()
形參的型別決定了形參實參互動的方式,如形參是引用型別,他將繫結到對應的實參上,引用形參是它對應實參的別名。否則,將實參的值拷貝後賦給形參。
當形參是引用型別,我們說,它對應的實參被引用傳遞(passed by reference)或者函式被傳引用呼叫(called by reference)。
當實參的值被拷貝給形參時,我們說,這樣的實參被值傳遞(passed by value)或者函式被傳值呼叫(called by value)。
傳值引數:
初始化乙個非引用型別變數,初始值被拷貝給變數,對變數的改動不會影響初始值。
int n =0;
int i = n;
i =1
;cout << n;
//輸出0,i的值改變,n的值不變。
指標形參:指標的行為和其他非引用型別一樣,當執行指標拷貝操作,拷貝的是指標的值。拷貝之後,兩個指標是不同的指標。因為通過指標,我們可以間接訪問它所指物件,所以通過指標可以修改它所指物件的值。
void
reset
(int
*ip)
int i =1;
reset
(&i)
;//改變i的值而非i的位址
cout <<
"i = "
<< i /輸出i=0。
——————————————————————————————————————
//實參類似於下面:(q)
int i =1;
int*q =
&i;//形參類似於下面:(p)
int n =0;
int*p =
&n;//實參呼叫形參類似與下面:
p = q;
//p指向了i
*p =2;
//通過p改變了i,但是此時q並未改變。
傳引用引數:
對於引用的操作,實際上是作用在引用所引的物件上。通過引用形參,允許函式改變乙個或多個實參的值。
void reset (
int&i)
int j=1;
reset
(j);
//j採用傳引用方式,因此他的值被改變。
cout/輸出j=0。
傳引用引數:當形參是頂層const時,傳給他常量物件或者非常量物件都是可以的。
const
int ci =1;
int i = ci;
//正確,當拷貝ci時,忽略了它的頂層const。
int*
const p =
&i;//const是頂層的,不能給p賦值。
*p =0;
//正確,通過p改變物件內容是允許的。
//在c++中,允許定義若干具有相同名字的函式,不過前提是不同函式的形參列表應該具有明顯區別。
void
fcn(
const
int i)
//呼叫fcn函式時,既可以傳入const int也可以傳入int。
void
fcn(
int i)
//此時再寫乙個函式定義,會報錯誤,因為重複定義了fcn(int)。
傳引用引數:我們可以用非常量初始化乙個底層const物件,但無法用乙個底層const物件初始化乙個非常量。如果形參是乙個非常量,那麼實參不能是乙個底層const物件
int i =1;
const
int*cp =
&i;//正確,但是cp不能改變i
const
int&r = i;
//正確,但是r不能改變i
const
int&r2 =1;
//正確
int*p = cp;
//錯誤,p型別和cp型別不匹配
int&r3 = r;
//錯誤,r3型別和r型別不匹配
int&r4 =1;
//錯誤,不能用字面值初始化乙個非常量引用
同樣的初始化規則應用到引數傳遞上:
void
reset
(int
*ip)
void
reset
(int
&i) string:
:size_type find_char
(const string &s,
char c,string:
:size_type &occurs)
int i =0;
const
int ci = i;
string:
:size_type ctr =0;
reset
(&i)
;//正確,呼叫形參型別是int*的reset函式。
reset
(&ci)
;//錯誤,不能用指向const int物件的指標初始化int*。
reset
(i);
//正確,呼叫形參型別是int&的reset函式。
reset
(ci)
;//錯誤,不能把普通引用繫結到const物件ci上。
reset(42
);//錯誤,不能把普通引用繫結到字面值上。
reset
(ctr)
;//錯誤,型別不匹配
find_char
("hello world!"
,'o'
,ctr)
;//正確,find_char第乙個形參是對常量的引用。
盡量使用常量引用:
把函式不會改變的形參定義成普通的引用會給函式呼叫者一種誤導,即函式可以修改它實參的值。此外,使用引用而非常量引用也會極大限制函式所能接受實參型別。不能把const物件、字面值、或者需要型別轉換的物件傳遞給普通的引用形參。
string:
:size_type find_char
(string &s,
char c,string:
:size_type &occurs)
find_char
("hello world!"
,'o'
,ctr)
;//編譯時發生錯誤,因為不能把普通引用繫結到const物件上。應該把string &s修改為const string &s
bool is_sentence
(const string &s)
c 引數傳遞
引數型別分為int,ref,out三種,預設為int.int型別在字方法中修改了對應變數後,主方法中的值不會發生變化.ref型別在方法中修改了對應變化後,主方法中的值也會發生變化.out主方法中對應的變數不需要初始化.例子 using system using system.collections....
C 引數傳遞
2.指標與引用區別 3.引數為指標的指標或指標的引用 將實參複製乙份給形參,形參為函式的區域性變數,因此函式對形參操作對實參沒有影響。若傳遞物件會產生物件副本,會呼叫拷貝建構函式,操作完後要呼叫析構函式。形參為指向實參位址的指標,其也算一種按值傳遞,只不過是將實參的位址作為引數傳遞給形參,因此函式對...
C 引數傳遞
值型別值傳遞 public void add1 int a 值型別引用傳遞 public void add2 ref int a public void add3 out int a 呼叫 b 5 add1 b b 5,輸出10 add2 ref b b 10,輸出10 add3 out b b 1...