您的位置:首页 > 编程语言 > C语言/C++

C++中的引用深入学习笔记

2014-03-02 13:17 211 查看
引用这种用法出现的目的:在函数传参时,将一般函数将实参的COPY传给形参,通过在函数参数表达式上加个引用符(&),其他一切都不用发生变化(函数内部代码编写,函数的调用参数列表输入等),就能够让函数内部对传入参数的操作直接在实参上进行。

一般来说,使用指针也能够实现同样的功能,但是往往会造成容易混乱的ugly代码,使用引用则会简洁很多,也方便。相对与一般参数能够传入的类型(int,char,char[],int[],char *,int *),都有相应的引用用法,分别代表着相应类型变量的引用(总原则就是:不COPY,直接对实参存储空间进行操作!!!)。下面是一些例子:

1.int

一般:void swap(int v1,int v2)

调用方法:int a,b;swap(a,b)

引用:void swap(int &v1,int &v2)

调用方法同上。

char等类型同理。

2.int *

void ptrswap(int * &v1,int * &v2)

对于int * &v1应从右到左理解:v1是一个引用,与指向int型对象的指针相关联。也就是说,v1知识传递进ptrswap函数的任意指针的别名。

调用方法:int *pi = &i;int *pj = &j;ptrswap(pi,pj);

3.int[]

void printValues(int (&arr)[10])

和其他类型一样,数组形参可声明为数组的引用。如果形参是数组的引用,编译器不会将数组实参转化为指针,而是传递数组的引用本身。在这种情况下,数组大小成为形参和实参类型的一部分。编译器检查数组实参的大小与形参大小是否匹配。上面函数只严格接受含有10个int类型数值的数组,这限制了哪些数组可以传递。然而,由于形参是引用,在函数体中依赖数组的大小是安全的。注意:&arr两边的圆括号是必须的,因为下表操作符具有更高的优先级。

4.返回引用

当函数返回引用类型时,没有复制返回值。相反,返回的是对象本身。例如,考虑下面的函数,此函数返回两个string类型形参中较短的那个字符串的引用:

const string &shorterString(const string &s1,const string &s2)

{

return s1.size() < s2.size() ? s1 : s2;

}

形参和返回类型都是指向const string 对象的引用,调用函数和返回结果时,都没有复制这些string 对象。

理解返回引用至关重要的是:千万不能返回局部变量的引用!

因为一旦函数结束,局部变量就会被释放,这样会导致函数返回值指向了对于这个程序不再有效的内存空间。同样道理的还有不能返回指向局部对象的指针,不然等函数调用结束,局部对象被释放,返回的指针就变成了指向不再存在的对象的悬垂指针。

5.引用返回左值

返回引用的函数返回一个左值,这样的函数可用于任何要求使用左值的地方:

char &get_val(string &str,string::size_type ix)

{

return str[ix];

}

int main()

{

string s("a value");

cout << s << endl;

get_val(s,0) = 'A';

cout << s << endl;

return 0;

}

能够这样子用是因为:函数返回的是一个引用,该引用是被返回元素的同义词(别名)。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: