1. 聲明引用變量的方法是在類型名後面加一個&符號,實際上&與變量名捆綁使用,如:string &str;
2. 一個引用指向一個對象,是現有對象的別名
3. 一旦創建了引用並初始化引用某特定對象,那麼它將總是引用此對象
4. 常量引用不能用於更改它所引用的對象
5.對常量的引用可以用其他任何引用來初始化,非常量引用不能通過一個常量的引用來初始化
6. 如果一個引用保存在某對象中,它必須在此對象構造函數的前導中初始化
7. 當一個方法的形式參數定義爲一個引用時,我們說它是按引用方式傳遞
8. 常量引用只能用於讀取
9. 引用在創建時必須初始化,或在其聲明中完成;或對於成員引用,在構造函數的前導中完成;或者調用一個帶有引用的方
法時,在調用時完成
/*******************************Header file: stackseq.h****************************/
/*程序:序列生成器頭文件
*/
#define _080117_STACK_H_
const int maxStack=5;
class IStack
{
friend class StackSeq; //類StackSeq是類IStack的朋友
public:
IStack() : _top(0) {}
void Push(int i);
int Pop();
private:
int _arr[maxStack];
int _top;
};
class StackSeq
{
public:
//通過一個對常量IStack的引用調用StackSeq構造函數
StackSeq(IStack const &stack) : _iCur(0), _stack(stack) {} //初始化引用
bool AtEnd() const;
void Advance();
int GetNum() const;
private:
IStack const &_stack; //引用stack //常量引用不能更改它所引用的對象(如本例中的TheStack對象)
int _iCur; //stack當前索引
};
#endif // end of _080117_STACK_H
/*******************************Source file: stackseq.cpp****************************/
/*程序:序列生成器源文件
/*目的:逐個返回保存在對象IStack中的值
/*方法:爲了從堆棧中回讀值,序列生成器需訪問堆棧的私有數據成員
/* 堆棧可以序列生成器成爲自己的友元而授權對它的訪問
*/
#include <cassert>
#include <iostream>
void IStack::Push(int i)
{
assert(_top<maxStack);
_arr[_top]=i;
++_top;
}
int IStack::Pop()
{
assert(_top>0);
--_top;
return _arr[_top];
}
bool StackSeq::AtEnd() const
{
return _iCur==_stack._top; //友元:可以訪問_top
//常量引用只能用於讀取。_stack爲常量引用,不能通過它更改_top的值
//_stack.Push(4); //error //由於Push不是一個常量方法,編譯器不允許StackSeq調用_stack.Push()
}
void StackSeq::Advance()
{
assert(!AtEnd());
++_iCur;
}
int StackSeq::GetNum() const
{
assert(!AtEnd());
return _stack._arr[_iCur]; //友元:可以訪問_arr
//常量引用只能用於讀取。_stack爲常量引用,不允許在此數組中進行寫入操作
}
void main()
{
IStack TheStack;
TheStack.Push(1);
TheStack.Push(2);
TheStack.Push(3);
//for(A;B;C)
//Expression A: 初始化,只在進入循環前執行一次
//Expression B: 邏輯測試,每次進入循環體時執行測試
//Expression C: 改值
//for(;;)永遠執行
for(StackSeq seq(TheStack); !seq.AtEnd(); seq.Advance())
{
std::cout<<" "<<seq.GetNum()<<std::endl;
}
}
輸出結果:
1
2
3