c++引用
来源:互联网 发布:pr cc mac 2017破解版 编辑:程序博客网 时间:2024/06/05 20:14
引用引入了对象的一个同义词。定义引用的表示方法与定义指针相似,只是用&代替了*。引用(reference)是c++对c语言的重要扩充。引用就是某一变量(目标)的一个别名,对引用的操作与对变量直接操作完全一样。引用的声明方法:类型标识符 &引用名=目标变量名
(1)&在此不是求地址运算,而是起标识作用。
(2)类型标识符是指目标变量的类型。
(3)声明引用时,必须同时对其进行初始化。
int &ref=a;//right int &ref;//error,引用必须初始化 int &ref=10;//error,10是一个字面值,也叫右值,不能被引用 const int &ref=10;//常引用可以绑定右值或者绑定const类型的值,const int ci =1024; const int &ref =ci;
void
swap(
int
*a,
int
*b)
{
int
temp;
temp=*a;
*a=*b;
*b=temp;
}
void
swap(
int
&a,
int
&b)
{
int
temp;
temp=a;
a=b;
b=temp;
}
const
maxCard=100;
Class Set
{
int
elems[maxCard];
//集合中的元素,maxCard表示集合中元素个数的最大值。
int
card;
//集合中元素的个数。
public
:
Set(){card=0;}
//构造函数
friend
Setoperator *(Set,Set);
//重载运算符号*,用于计算集合的交集用对象作为传值参数
//friendSetoperator*(Set&,Set&)重载运算符号*,用于计算集合的交集用对象的引用作为传值参数
...
}
Setoperator *(Set Set1,Set Set2)
{
Set res;
for
(
int
i=0;i<Set1.card;++i)
for
(
int
j=0;j>Set2.card;++j)
if
(Set1.elems[i]==Set2.elems[j]){
res.elems[res.card++]=Set1.elems[i];
break
;
}
returnres;
}
Setoperator *(Set& Set1,Set& Set2)
{
Set res;
for
(
int
i=0;i<Set1.card;++i)
for
(
int
j=0;j>Set2.card;++j)
if
(Set1.elems[i]==Set2.elems[j]){
res.elems[res.card++]=Set1.elems[i];
break
;
}
returnres;
}
要以引用返回函数值,则函数定义时要按以下格式:
类型标识符 &函数名(形参列表及类型说明)
{函数体}
说明:
(1)以引用返回函数值,定义函数时需要在函数名前加&
(2)用引用返回一个函数值的最大好处是,在内存中不产生被返回值的副本。
以下程序中定义了一个普通的函数fn1(它用返回值的方法返回函数值),另外一个函数fn2,它以引用的方法返回函数值。
#include <iostream.h>float temp; //定义全局变量tempfloat fn1(float r); //声明函数fn1float &fn2(float r); //声明函数fn2float fn1(float r) //定义函数fn1,它以返回值的方法返回函数值{ temp=(float)(r*r*3.14); return temp;}float &fn2(float r) //定义函数fn2,它以引用方式返回函数值{ temp=(float)(r*r*3.14); return temp;}void main() //主函数{ float a=fn1(10.0); //第1种情况,系统生成要返回值的副本(即临时变量) float &b=fn1(10.0); //第2种情况,可能会出错(不同 C++系统有不同规定) //不能从被调函数中返回一个临时变量或局部变量的引用 float c=fn2(10.0); //第3种情况,系统不生成返回值的副本 //可以从被调函数中返回一个全局变量的引用 float &d=fn2(10.0); //第4种情况,系统不生成返回值的副本 //可以从被调函数中返回一个全局变量的引用 cout<<a<<c<<d;}
引用作为返回值,必须遵守以下规则:
(1)不能返回局部变量的引用。这条可以参照Effective C++[1]的Item 31。主要原因是局部变量会在函数返回后被销毁,因此被返回的引用就成为了"无所指"的引用,程序会进入未知状态。
(2)不能返回函数内部new分配的内存的引用。这条可以参照Effective C++[1]的Item 31。虽然不存在局部变量的被动销毁问题,可对于这种情况(返回函数内部new分配内存的引用),又面临其它尴尬局面。例如,被函数返回的引用只是作为一 个临时变量出现,而没有被赋予一个实际的变量,那么这个引用所指向的空间(由new分配)就无法释放,造成memory leak。
(3)可以返回类成员的引用,但最好是const。这条原则可以参照Effective C++[1]的Item 30。主要原因是当对象的属性是与某种业务规则(business rule)相关联的时候,其赋值常常与某些其它属性或者对象的状态有关,因此有必要将赋值操作封装在一个业务规则当中。如果其它对象可以获得该属性的非常 量引用(或指针),那么对该属性的单纯赋值就会破坏业务规则的完整性。
- 引用(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 引用计数
- 给初学者的RxJava2.0教程(七)
- php概率算法
- Java如何打印数组之Array.ToString()
- 剑指offer编程题(1):数组
- 第四次实验
- c++引用
- memcached
- linux常用命令笔记(一):目录切换、查找文件、权限设置
- 说说 JavaScript 中 BOM 的 navigator 对象
- 迁移SVN版本库
- 积累的时间工具类
- leetcode题解-26. Remove Duplicates from Sorted Array && 27. Remove Element
- 《c++primer》笔记 第3章 字符串、向量和数组
- ios 修改 label 的行间距