兩種型別的引數都允許有效地向函式傳遞大型類物件
引用必須被初始化為指向乙個物件,一旦初始化了它就不能再指向其他物件。指標可以指向一系列不同的物件,也可以什麼都不指向。因為指標可能指向乙個物件或沒有任何物件,所以函式在確定指標實際指向乙個有效的物件之前,不能安全地解引用dereference 乙個指標。例如
class x;
void manip( x *px )
另一方面,對於引用引數,函式不需要保證它指向乙個物件,引用必須指向乙個物件,
甚至在我們不希望這樣時也是如此。例如
class type ;
void operate( const type& p1, const type& p2 );
int main()
如果乙個引數可能在函式中指向不同的物件,或者這個引數可能不指向任何物件,則必
須使用指標引數。
引用引數的乙個重要用法是,它允許我們在有效地實現過載操作符的同時,還能保證用
法的直觀性。(過載操作符的完整討論見第15 章)讓我們從下面的例子開始它使用了matrix
類型別,我們想支援兩個matrix 類物件的加法和賦值操作符,使它們的用法同內建型別一樣
自然。matrix a, b, c;
c = a + b;
matrix 類物件的加法和賦值操作符用過載操作符來實現。被過載的操作符是乙個帶有特
殊名字的函式。(在加法操作符的例子中函式名是operator+ )讓我們為這個過載操作符提供
乙個定義。
matrix // 加法返回乙個matrix 物件
operator+( // 過載操作符的名字
matrix m1, // 操作符左運算元的型別
matrix m2 // 操作符右運算元的型別
)該實現支援兩個matrix 物件的加法如
a + b
但不幸的是它的效率低得讓人難以接受。注意operator+()的引數不是引用,這意味
著operator+()的實參是按值傳遞的兩個matrix。( 物件a 和b 的內容被拷貝到opertor+()函式
的引數區中)因為matrix 類物件非常大,分配這樣乙個物件並把它拷貝到函式引數區中的時
間和空間開銷高得讓人難以接受。
為了提高我們的操作符函式的效率,假定我們決定把引數宣告為指標。下面是對
operator+()新的實現**
// 使用指標引數重新實現
matrix operator+( matrix *m1, matrix *m2 )
但是這個實現**有這樣的問題。雖然我們獲得了效率,但是它是以放棄加法操作
符用法的直觀性為代價的。現在指標引數要求我們傳遞位址作為實參,它們指向我們希望做
加法操作的matrix 物件。現在我們的加法操作必須如下程式設計
&a + &b; // 不太好, 但也不是不可能
但是這比較難看而且可能引起一些程式設計師抱怨使用者介面不友好在乙個復合表示式
中加三個物件變得很困難
// 喔! 這無法工作
// &a + &b 的返回型別是 matrix 物件
&a + &b + &c;
為了使在指標方案下三個物件的加法能夠很好地實現程式必須這樣寫
// ok: 這樣能行, 但是
&( &a + &b ) + &c;
當然沒有人希望那樣寫引用引數提供了我們需要的方案當引數是引用時函式接
收到的是實參的左值而不是值的拷貝因為函式知道實參在記憶體的什麼位置所以實參值沒
有被拷貝到函式的引數區引用引數的實參是matrix 物件本身這允許我們像對內建資料類
型的物件使用加法操作符一樣自然地使用加法操作符
下面是matrix 類的過載加法操作符的修訂版本
// 使用引用引數的新實現
matrix operator+( const matrix &m1, const matrix &m2 )
該實現支援如下形式的matrix 物件的加法
a + b + c
VC 引用型別與指標型別
兩種型別的引數都允許有效地向函式傳遞大型類物件 引用必須被初始化為指向乙個物件,一旦初始化了它就不能再指向其他物件。指標可以指向一系列不同的物件,也可以什麼都不指向。因為指標可能指向乙個物件或沒有任何物件,所以函式在確定指標實際指向乙個有效的物件之前,不能安全地解引用dereference 乙個指標...
C 復合型別 引用與指標
復合型別 引用與指標 1 引用即別名 int refval ival int ii refval equal ii ivalrefval就是ival的另乙個名字,直接食用即可。2 引用並非物件,相反的,它只是為存在的物件起的另乙個名字 3 引用只能bind物件,不能與字面值或某個表示式bind in...
引用型別和指標
三個整數a,b,c從小到大排序 輸入三個整數a,b,c 按照從小到大次序輸出。1 2 3 1 2 3 6 6 6 1 10 100 include include includeusing namespace std void swap2 int a,int b int main int a,b,c...