I come, I see, I conquer

                    —Gaius Julius Caesar

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::
引用(reference)
1. 声明引用变量的方法是在类型名后面加一个&符号,实际上&与变量名捆绑使用,如:string &str;
2. 一个引用指向一个对象,是现有对象的别名
3. 一旦创建了引用并初始化引用某特定对象,那么它将总是引用此对象
4. 常量引用不能用于更改它所引用的对象
5.对常量的引用可以用其他任何引用来初始化,非常量引用不能通过一个常量的引用来初始化
6. 如果一个引用保存在某对象中,它必须在此对象构造函数的前导中初始化
7. 当一个方法的形式参数定义为一个引用时,我们说它是按引用方式传递
8. 常量引用只能用于读取
9. 引用在创建时必须初始化,或在其声明中完成;或对于成员引用,在构造函数的前导中完成;或者调用一个带有引用的方
    法时,在调用时完成

StackSeq has-access-to IStack

/*******************************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
posted on 2008-01-19 00:20  jcsu  阅读(788)  评论(0编辑  收藏  举报