C++引用
来源:互联网 发布:cnabs 中国专利数据库 编辑:程序博客网 时间:2024/06/04 00:37
转载请注明出处:http://www.cnblogs.com/Ljian1992/p/4198015.html
概述
变量是一段实际的连续的存储空间的别名,程序中通过变量来申请并命名存储空间,并且通过变量的名字可以使用该存储空间。在C语言中一段实际的连续的存储空间只能有一个别名(指针不能当作别名),但在C++中一段实际的连续的存储空间却可以有多个别名,这一种实现的机制即为引用。引用是一个已存在的变量的别名, 对引用操操作等于对变量的操作。
语法
type &name = var;
Tips:
1.引用必须在定义时初始化,并且初始化后无法再引用其它变量
例子
int a = 4;int &b = a;
引用本质
引用在编译器的内部是用常量指针来实现的,因此引用既是指针,它是会占用内存空间的,它所占的内存空间的大小和指针所占的内存空间的大小是一致的。但在使用引用的时候,它会自动加上解引用符号。由于引用的本质是常量指针,故初始化后无法再改变它,也就是无法再引用其它变量了。
C++把引用的本质隐藏了起来,让人感觉到它就是一个变量的新名字,站在使用者的角度,我们也没必要把引用当成一个常量指针,引用与指针并没有任何关系。但当使用引用程序出错后,可以从这一角度去分析为什么出错
测试代码
复制代码#include <stdio.h> struct references{
int &ref1;char &ref2;
}; struct poiter{
int *poiter1;char *poiter2;
}; int main (void){
char a;char &b = a; //通过常量指针来模拟引用char *const c = &a; #define c (*c)printf ("sizeof(a) = %d\n",(int)sizeof (a));printf ("sizeof(b) = %d\n",(int)sizeof (b));printf ("sizeof(c) = %d\n",(int)sizeof (c));printf ("a addr: %p\n", &a);printf ("b addr: %p\n", &b);printf ("c addr: %p\n", &c); //证明引用占内存空间的大小和指针所占的内存空间大小是一致的printf ("sizeof(struct references) = %d\n",(int)sizeof (struct references));printf ("sizeof(struct poiter) = %d\n",(int)sizeof (struct poiter));return 0;
}
引用相对于指针的优势
1.引用可以使到函数的返回值作为左值使用
返回栈变量的引用:由于栈空间的变量,会随着函数生命周期的结束而销毁,因此是栈变量是不能够返回引用作为左值使用的,也不初始化其它 引用
返回静态变量或全局变量的引用:由于静态变量或全局变量的生命周期是程序的生命周期,故其返回值可以作为左值来使用,并且能够初始化其它引用
例
#include <stdio.h>
int & ret_reference(void)
{
static int c = 0;
return c;
}
int main(int argc, char *argv[])
{
printf ("static c = %d\n", ret_reference ());
ret_reference() = 20; //修改静态局部变量为20
printf ("static c = %d\n", ret_reference ());
printf("Press enter to continue ...");
getchar();
return 0;
}
2.引用可以使到程序更容易理解
例
void swap(int& a, int& b)
{
int t = a;
a = b;
b = t;
}
调用:swap (a, b);
void swap_poiter (int *a, int *b)
{
int tmp = *a;
*a = *b;
*b = tmp;
}
调用:swap_poiter (&a, &b)
同样是交换两个整形的数据,用引用来实现明显比用指针来实现更容易理解,也更符合人的思维习惯
引用与三目运算符
1.三目运算符返回变量的引用,若无变量则返回常量
2.三目运算符可以返回变量本身,故可以作为左值来使用
3.三目运算符可能的返回值中如果有一个常量值,则不能作为左值来使用
例
#include<stdio.h>int main (void){int a = 1;int b = 2;(a < b? a: b) = 3;printf ("a = %d\nb = %d\n", a, b);(a<b? a: 3) = 3; //报错 (a<b? 3: 2) = 3; //报错printf ("press enter to continue.......\n");return 0;}
- 引用(c++)
- C++----引用
- c++-引用
- C ++ 引用
- 【c++】引用
- 【c++】引用
- C++:引用
- C++:引用
- C/C++:C++引用
- 【c/c++】const引用
- 【C/C++】c++弱引用 强引用
- 枚举 c#(引用)
- 数组引用(C++)
- C++_引用
- c语言中的引用
- (Linux,c++)引用
- 引用(C++)
- objective-c 引用计数
- 计算机网络-协议层次及其服务模型
- gsoap编译(仅供自己参考)
- 22异常处理
- 以太坊连载(十一):以太坊账户管理
- ObjectSpace模块
- C++引用
- 153. Find Minimum in Rotated Sorted Array
- MySQL修改表结构操作命令总结
- Android面试
- JS的事件冒泡事件和事件捕获分析
- 微信小程序之-返回上一页
- EasyUI和extjs
- scala学习笔记(三)
- 以太坊连载(十二):创建安全多签名钱包及高级设置