<C++实践系列>C++中的引用(reference)

2016-01-29 12:22 4 1 收藏

<C++实践系列>C++中的引用(reference),&lt;C++实践系列&gt;C++中的引用(reference)

【 tulaoshi.com - C语言心得技巧 】

<C++实践系列C++中的引用(reference)
作者:张笑猛

提交者:eastvc 发布日期:2003-11-22 14:44:07
原文出处:http://objects.nease.net/


1.简介

2.引用的语法

3.引用使用技巧
    3.1 引用和多态
    3.2 作为参数
    3.3 作为返回值
    3.4 什么时候使用引用

4. 参考资料

1.简介

    引用是C++引入的新语言特性。从语意上来说,引用就是一个变量的别名,就好象古代人的“字”和“号”,东坡居士和苏轼只是一个人的不同称呼。对引用的操作对变量产生的影响与对变量直接操作完全一样。例如:

int i = 0;
int & iRef = i;

iRef++;  // i = iRef = 1

    尽管引用不使用指针的操作符(*, -)但是,它看上去跟指针好象并没有区别,而且就上面的例子而言,这个引用所产生的作用完全可以由指针完成。那么为什么C++中还要增加这样一个特性呢?引用显然应该具备指针不能完成的功能,否则它就失去了价值。这方面的探讨我们留到第3节。

2.引用的语法

在这里我们只讨论一些语法相关的问题。

·引用必须在定义的同时初始化

int i;
int & j;  // 错误,没有初始化。
int & k=i; // 正确

    这个例子有个很好的比喻,小时候小朋友间会互相起“外号”,这些外号在产生的时候总是有所指的,即针对一个具体的小朋友的。引用也一样,定义的时候,必须指明它是谁的别名。

·外部(extern)引用定义不必给出初值

extern int & i; // 正确,不必给出初值

·引用初始化后不能再使其成为其它变量的引用

int j, k;
int & i = j;
i = k;    // 错误,不能更改!

    引用类似一个常量指针(int * const p),不能修改引用的指向。

·引用的地址

    假设有如下定义:

int j;
int & i = j;

    那么,&i应该是什么呢?是一个“引用的地址”么?答案是:no。&i = &j,就是j这个变量的地址。

(本文来源于图老师网站,更多请访问https://www.tulaoshi.com)3.引用使用技巧3.1 引用和多态

    引用是除指针外另一个可以产生多态效果的手段。这意味着,一个基类的引用可以指向它的派生类实例。例如:

class A;
class B: public A
{
   ...
};

B b;
A & aRef = b;    // 基类引用指向派生类

    如果A类中定义有虚函数,并且在B类中重写了这个虚函数,就可以通过aRef产生多态效果。

3.2 作为参数

    引用的一个重要作用就是作为函数的参数类型。C/C++的函数参数是传值的,如果有大对象(例如一个大的结构)需要作为参数传递的时候,以前的(C语言中)方案往往是指针,因为这样可以避免将整个对象全部压栈,可以提高程序的效率。但是现在(C++中)又增加了一种同样有效率的选择,就是引用。

    与指针类型的参数一样,引用不论指向什么类型的对象,作为参数传递的时候都是只压栈4个字节(在32位机上)。引用所占用的4字节大小是根据编译器产生的代码判断的,因为sizeof(a_reference)只能得到它所指向对象的大小。

    引用型参数应该在能被定义为const的情况下,尽量定义为const,这不光是让代码更健壮,也有些其它方面的需要,例如,假设有如下函数声明:

string foo();
void bar(string & s);

    那么下面的表达式将是非法的:

bar(foo());
bar("hello world");

(本文来源于图老师网站,更多请访问https://www.tulaoshi.com)

    原因在于foo()和"hello world"串都会产生一个临时对象,而在C++中,这些临时对象都是const类型的。因此上面的表达式就是试图将一个const类型的对象转换为非const类型,这是非法的。

3.3 作为返回值

    引用作为返回值的时候,有一些规则必须遵守。这些规则包括:

不能返回局部变量的引用。这条可以参照Effective C++[1]的Item 31。主要原因是局部变量会在函数返回后被销毁,因此被返回的引用就成为了“无所指”的引用,程序会进入未知状态。 不能返回函数内部new分配的内存的引用。这条可以参照Effective C++[1]的Item 31。虽然不存在局部变量的被动销毁问题,可对于这种情况(返回函数内部new分配内存的引用),又面临其它尴尬局面。例如,被函数返回的引用只是作为一个临时变量出现,而没有被赋予一个实际的变量,那

来源:https://www.tulaoshi.com/n/20160129/1485810.html

延伸阅读
随着计算机语言的发展,我们现在编写一个程序越来越轻易了。利用一些软件开发工具,往往只要通过鼠标的拖拖点点,计算机就会自动帮你生成许多代码。但在很多时候,计算机的这种能力被滥用了,我们往往只考虑把这个程序搭起来,而不去考虑程序的性能如何,程序是否足够的健壮。 !-- frame contents -- !-- /frame contents -- 而此节...
在C++中,以类、虚函数等为代表的数据抽象功能一直是C++的核心和难点。这里我想结合自己的使用经验,谈谈对C++中抽象的一点浅薄看法! 我认为C++的抽象应该是指:从我们需要解决的问题出发,在与该问题相关的一组关联对象中提取出主要的或共有的部分――说简单一点,就是用相同的行为来操作不同的对象。 从提出问题到找出与该问题...
const引用是指向const对象的引用。 代码如下: const int i = 10; const int &ref = i; 可以读取ref,但不能修改。这样做是有意义的,因为i本身就不可修改,当然也不能通过ref来修改了。所以也就有将const变量赋值给非const引用是非法的。 代码如下: int &ref1 = i; // error: nonconst reference to a const object 非const引用...
static 是C++中很常用的修饰符,它被用来控制变量的存储方式和可见性,下面我将从 static 修饰符的产生原因、作用谈起,全面分析static 修饰符的实质。 static 的两大作用: 一、控制存储方式: static被引入以告知编译器,将变量存储在程序的静态存储区而非栈上空间。 1、引出原因:函数内部定义的变量,在程序执行到它的...
函数存放在内存的代码区域内,它们同样有地址,我们如何能获得函数的地址呢? 假如我们有一个int test(int a)的函数,那么,它的地址就是函数的名字,这一点如同数组一样,数组的名字就是数组的起始地址。 !-- frame contents -- !-- /frame contents -- 定义一个指向函数的指针用如下的形式,以上面的test()为例: ...

经验教程

933

收藏

70
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部