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;
}
能够这样子用是因为:函数返回的是一个引用,该引用是被返回元素的同义词(别名)。
一般来说,使用指针也能够实现同样的功能,但是往往会造成容易混乱的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;
}
能够这样子用是因为:函数返回的是一个引用,该引用是被返回元素的同义词(别名)。
相关文章推荐
- C++基础学习笔记----第六课(const和引用的扩展、重载函数和C方式编译的深入)
- C++学习笔记(13)——利用对象、引用、指针调用虚函数
- C/C++中关于地址、指针和引用变量的学习笔记(一)
- Effective C++ 学习笔记:让operator=返回*this的引用
- C++ 学习笔记之 引用
- c++学习笔记之函数引用返回
- C++学习笔记十四之引用变量&
- C++学习笔记(三):引用解析
- [C++学习笔记]--常量对象、常量成员函数和常引用
- C/C++中关于地址、指针和引用变量的学习笔记(二) : 数组
- C++学习笔记――引用与拷贝构造函数
- c++学习笔记(四):函数按指针调用和按引用调用
- [C++学习笔记]--位运算、引用、const指针
- C++学习笔记29,引用变量(1)
- Effective C++ 学习笔记:让operator=返回*this的引用
- C++基础学习笔记----第十四课(new和malloc的区别、单例模式等深入)
- c++学习笔记-----引用
- C++ 学习笔记之 引用
- VS2010 C++ 学习笔记(六) this指针 const 指针 引用
- C++之离港篇学习笔记之引用