1. 程式人生 > >C++參數傳遞

C++參數傳遞

對象共享 實參 tint turn tin ostream error 而是 編譯

*是取值運算符,對地址使用可以獲得地址中儲存的數值;對於指針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++參數傳遞