引用入门
来源:互联网 发布:已而为知之者,殆而已矣 编辑:程序博客网 时间:2024/05/16 02:45
在C++中提出了引用这个概念,它和指针类似,但用起来更方便。
一、普通引用
这里的引用有时候也称为别名,实际就是说两个不同名称的标识符指向了同一个内存地址。
using namespace std;
int main()
{
int y;
int& r=y;
const int& q=12;
cout<<y<<" "<<r<<endl;
r++;
cout<<y<<" "<<r<<endl;
}
这里有一个比较特别的地方,就是可以取常量的引用,但引用也必须设为常量,这里编译器为12分配了存储单元,值被初始化为12,q就是这个存储单元的别名。
后面可以看到,r 增加后,y也增加了,说明它们指向的是同一块地址。
使用引用时需要注意以下规则:
1) 当引用被创建时,它必须被初始化。
2)一旦一个引用被初始化指向一个对象,它就不能改变为另一个对象的引用。
3)不可能有NULL的引用。必须确保引用是和一块合法的存储单元关联。
二、函数中的引用
1.引用参数
引用常被用来做函数的参数,这个时候它的行为就和指针一样了,但语法更清晰。就是常说的按引用传递。
{
(*x)++;
}
void g(int& x)
{
x++;
}
int main()
{
int a=0;
f(&a);
g(a);
}
不过有时候这种传递参数的方法比较隐蔽,不知道传的参数是否会被修改。
另外,如果要传递常量的话,就必须声明函数参数为常量引用:
void f(const int& a) {};
f(1);
2.指针引用
有时候我们需要传递的是指针的地址,在C语言里我们通常是这样:
void f(int**);
int i=4;
int* ip=&i;
f(&ip);
引用则可以有更简单的语法
using namespace std;
void increment(int*& i) { i++ }
int main()
{
int* i=0;
cout<<"i= "<<i<<endl;
increment(i);
cout<<"i= "<<i<<endl;
}
3. 返回引用
有些用户自定义的类型很大,如果按值返回开销很大,这时采用按引用返回,就只返回地址,这样比较快 捷。这个是在运算符重载中经常遇见的。但需要注意的是“不要返回临时量,也就是局部变量”
{
public:
int x;
};
Widget& f(Widget& a)
{
a.x=10;
return a; //OK!
}
Widget& g()
{
Widget a;
return a; //返回临时量 ,error
}
Widget& h()
{
static Widget a;
return a; //静态 OK!
}
int main()
{
Widget a;
Widget b=f(a);
Widget c=h();
}
在C++里面引用的运用是很灵活的,它最重要的地方就是在拷贝构造函数里面。这个主题就下次再讲了。
- 引用入门
- COM入门(引用)
- COM入门2(引用)
- COM入门3(引用)
- c++入门之引用
- C++入门 引用详解
- 强引用、软引用、弱引用、虚引用(入门篇)
- Linux-HA 入门指南(引用)
- 【线段树】入门--引用建树
- php:对象 和 引用 入门
- Linux-HA 入门指南(引用)
- F# 入门(八): 值类型/引用类型
- 指针和引用以及迭代器入门
- C++快速入门 (四) 引用 和 指针
- WCF入门--发布到IIS并引用
- 快速入门C++ 04(传值、传址传引用)
- 《java入门第一季》之参数引用
- C++入门基础知识:类和引用
- 同一个进程(pid一样),不同检测工具检测到的端口怎么不一样呢31488端口和123端口报告
- Symbian 入门
- JDBC1
- 变量(对象?)的地址和占用内存尺寸 -- C 语言 指针
- 关于URL传递日文字符乱码问题的解决方案
- 引用入门
- 席慕容诗选
- 我觉得
- 用Extraction应用构建平台提升信息化建设效率
- 获得某月最后一天,每月天数
- js操作xml
- PHP截取字符类
- 摄像头视频录制及图象的捕捉保存
- WaitForSingleObject的用法