荔园在线

荔园之美,在春之萌芽,在夏之绽放,在秋之收获,在冬之沉淀

[回到开始] [上一篇][下一篇]


发信人: Second (石开), 信区: Program
标  题: Part of C++ FAQ Lite[8]--引用
发信站: 荔园晨风BBS站 (Thu Jun  7 05:21:52 2001), 转信

(part of c++ faq lite, copyright ? 1991-96, marshall cline, cline@parashift
.com)
----------------------------------------------------------------------------
----
faqs in section [8]:
[8.1] 什么是引用?
[8.2] 给引用赋值,意味着什么?
[8.3] 返回一个引用,意味着什么?
[8.4] 如何才能够使一个引用指向另一个对象?
[8.5] 我什么时候该使用引用, 什么时候该使用指针?
----------------------------------------------------------------------------
----
[8.1] 什么是引用?
对象的别名(改变的名称)
引用经常用于“按引用传递”:
    void swap(int& i, int& j)
    {
      int tmp = i;
      i = j;
      j = tmp;
    }
    main()
    {
      int x, y;
      // ...
      swap(x,y);
    }
此处的 i 和 j 分别是main中的 x 和 y。换句话说,i 就是 x —— 并非指向 x 的指
针,也不是 x 的
拷贝,而是 x 本身。对 i 的任何改变同样会影响 x,反之亦然。
好,这就是作为一个程序员所认知的引用。现在,给你一个不同的视角,这可能会让你
更糊涂,那就是引
用是如何实现的。典型的情况下,对象 x 的引用 i 是 x 的机器地址。但是,当程序员
说 i++ 时, 编
译器产生增加 x 的代码。 更详细的来说, 编译器用来寻找 x 的地址位并没有被改变。
c 程序员将此认
为好像是c风格的按指针传递,只是句法不同 (1) 将 & 从调用者移到了被调用者,(2)
消除了*s。换句话
说,c 程序员会将 i 看作为宏 (*p),而 p 就是指向 x 的指针(举例来说,编译器自
动地消除引用潜在
的指针;i++被改变为 (*p)++;i = 7 被自动地转变成 *p = 7)
重要的注解: 请不要将引用看作为指向一个对象的奇异指针,即使引用经常是用汇编语
言下的地址来实
现的。引用就是对象。不是指向对象的指针,也不是对象的拷贝,就是对象。
----------------------------------------------------------------------------
----
[8.2] 给引用赋值,意味着什么?
改变引用的“指示物”(引用所指的对象)
请记住: 引用就是指示物,所以当改变引用时,也会改变指示物。以编译器作者的行话
来说,引用是一个
“左值”(它可以出现在赋值运算符左边)
----------------------------------------------------------------------------
----
[8.3] 返回一个引用,意味着什么?
该函数调用可以出现在赋值运算符的左边
最初这种能力看起来有些古怪。例如,没有人会认为表达式 f() = 7 有意义。然而,如
果 a 是一个
array 类,大多数人会认为 a[i] = 7 有意义,即使 a[i] 实际上是一个函数调用的伪
装(它调用了
array::operator[](int),如下的 array 类)
    class array {
    public:
      int size() const;
      float& operator[] (int index);
      // ...
    };
    main()
    {
      array a;
      for (int i = 0; i < a.size(); ++i)
        a[i] = 7;    // 这句调用了 array::operator[](int)
    }
----------------------------------------------------------------------------
----
[8.4] 如何能够使一个引用重新指向另一个对象?
不行。
你无法让引用与其指示物分离
和指针不同,一旦引用和对象绑定,它无法再被重新指向其他对象。引用本身不是一个
对象 (它没有标
识; 当试图获得引用的地址时,你将的到它的指示物的地址; 记住:引用就是它的指示
物)。
从某种意义上来说, 引用类似 int* const p 这样的常量指针(并非如 const int* p
这样的指向常量的
指针)。不管有多么类似,请不要混淆引用和指针; 它们完全不同。
----------------------------------------------------------------------------
----
[8.5] 我什么时候该使用引用, 什么时候该使用指针?
尽可能使用引用,不得已时使用指针
当你不需要“重新指向”时,引用一般优先于指针被选用。这通常意味着引用用于类的
公有接口时更有
用。引用出现的典型场合是对象的外壳,而指针用于内部。
上述的例外情况是函数的参数或返回值需要一个“哨兵”引用。这时通常最好返回/获取
一个指针,并使
用 null 指针来完成这个特殊的使命。(引用应该总是对象的别名,而不是消除引用的空
指针)。
注意: 由于在调用者的代码处,无法提供清晰的的引用语义,所以传统的 c 程序员有时
并不喜欢引用。
然而,当有了一些 c++ 经验后,你会很快认识到这是信息隐藏的一种形式,它是有益的
而不是有害的。
举例来说,程序员应该针对要解决的问题写代码,而不是机器本身。

--
                            既然热爱生命
                            那么,
                            一切都在意料之中。

※ 来源:·荔园晨风BBS站 bbs.szu.edu.cn·[FROM: 192.168.28.16]


[回到开始] [上一篇][下一篇]

荔园在线首页 友情链接:深圳大学 深大招生 荔园晨风BBS S-Term软件 网络书店