引用

 1. 聲明引用變量的方法是在類型名後面加一個&符號,實際上&與變量名捆綁使用,如:string &str;
2. 一個引用指向一個對象,是現有對象的別名
3. 一旦創建了引用並初始化引用某特定對象,那麼它將總是引用此對象
4. 常量引用不能用於更改它所引用的對象
5.對常量的引用可以用其他任何引用來初始化,非常量引用不能通過一個常量的引用來初始化
6. 如果一個引用保存在某對象中,它必須在此對象構造函數的前導中初始化
7. 當一個方法的形式參數定義爲一個引用時,我們說它是按引用方式傳遞
8. 常量引用只能用於讀取
9. 引用在創建時必須初始化,或在其聲明中完成;或對於成員引用,在構造函數的前導中完成;或者調用一個帶有引用的方
    法時,在調用時完成

/*******************************Header file: stackseq.h****************************/
/*程序:序列生成器頭文件
 */

#if !defined(_080117_STACK_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 "stackseq.h"
#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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章