c++ 关于引用&的一些知识
2014-05-29 09:18
489 查看
引用是已定义的变量的别名(另一个名称),这种变量有什么作用? 其主要用途是用做函数的形参,通过将引用变量作为参数,函数将使用原始数据,而不是其副本
。这样除了指针之外,引用也可以为函数处理大型结构提供了一种非常方便的途径,对于设计类来说这是必不可少的。
引用变量的典型用法
用做别名的时候:
int rats=100;
int &rodents=rats
这样就可以通过rodent来操作rats的代表的数据
rodents++;
rats会变为101
也许有人会觉得这和指针很像或者说是指针的另一种
引用和指针的差别
引用在声明时必须初始化
int rat;
int &rodent;
rodent=rat;//这是错的
其实引用更接近const指针,必须在创建是初始化,一旦与某个变量关联起来,就将一直效忠于它
int &rodents = rats;
int* const pr=rats
用做形参的时候:
void swapr(int &a,int &b)
{
int temp;
temp=a;
a=b;
b=temp;
}
int main()
{
int a=3;
int b=4;
swapr(a,b);
cout<<a<<" "<<b<<endl;
return 0;
}
输出的结果会是 4 3
因为传递引用变量函数将直接操作原始数据
即通过引用变量来操作内存中的数据
而没有生成新的变量来存放参数的值
通过引用变量往往可以达到返回多个参数的效果
double re(double &i)
{
i++;
return i;
}
临时变量、引用参数
考虑下面的代码
double side=3.0;
double *pd=&side;
double &rd=side;
long edge=5L;
double lens[4]={2.0,5.0,10.0,12.0}
double c1=re(side);
double c2=re(lens[2]);
double c3=re(rd);
double c4=re(*pd);
double c5=re(edge);// 将会产生临时变量,函数结束释放
double c6=re(lens);//将会产生临时变量,函数结束释放
double c7=re(side+7.0)//将会产生临时变量,函数结束释放
为什么会这样呢?edga虽然是变量,类型却不正确,lens 同上,side+7 类型正确但是没有名称,在这些情况下
,编译器都会生成一个临时匿名变量,让形参指向它。这临时变量会随着函数的结束释放
如果接受引用的参数的意图是修改作为参数传递的变量,则创建临时变量将阻止这个意图的实现。
解决方法是,禁止创建临时变量
2.为何有些函数要返回引用
传统返回机制于按值传递函数参数类似:计算关键return 后面的表达式,并将结果返回给调用函数。
返回一个引用而不是返回一个结构或者类的好处是,返回类或者结构将把整个结构复制到一个临时位置,再将
这个拷贝到接受返回数据的变量指向的空间。但返回值是引用的时候,直接把变量指向的地址赋值为函数返回
的地址,其效率更高
返回引用是需要注意的问题
返回引用最重要的一点是,应避免返回函数终止时不再存在内存单元引用。即不可以返回临时变量,因为临时变量在
函数结束时会自动释放。
为避免这种问题:
最简单的方法是,返回一个作为参数传递给函数的引用。
structs &name(struts &target,const structs &soure)
{
code.......
return target;
}
另一种方法是用new来分配新的存储空间
string & cstr()
{
string *str=new string("15");
return *str;
}
使用引用参数的主要原因有两个
1.程序员能够修改调用函数中的数据对象
2.通过传递引用而不是整个数据对象,可以提高程序运行速度
当然指针也能达到这种效果,那么什么时候用指针什么时候用引用呢?
对于使用传递的值而不做修改的函数
1.如果数据对象很小,如果内置数据或小型结构,则按值传递。
2.如果数据的对象是数组,则用指针,因为这是唯一的选择,并将指针声明为指向const的指针
3.如果市局对象是较大的结构,则使用const指针或者const引用,可以提高程序的效率,也可以
节省复制结构所需的空间
4,如果数据是对象类,则使用const引用.类的设计的语义常常要求使用引用,这是c++新增这项特性(引用)
的主要原因
对用修改函数中数据的函数
1.如果数据是内置数据类型,则用指针。
2.如果数据是数组,则只能用指针
3.如果对象是结构,则使用引用或指针
4.如果数据对象是类的对象,则使用引用
当然这是一些知道原则,很有可能有充分的里有做出其他选择
。这样除了指针之外,引用也可以为函数处理大型结构提供了一种非常方便的途径,对于设计类来说这是必不可少的。
引用变量的典型用法
用做别名的时候:
int rats=100;
int &rodents=rats
这样就可以通过rodent来操作rats的代表的数据
rodents++;
rats会变为101
也许有人会觉得这和指针很像或者说是指针的另一种
引用和指针的差别
引用在声明时必须初始化
int rat;
int &rodent;
rodent=rat;//这是错的
其实引用更接近const指针,必须在创建是初始化,一旦与某个变量关联起来,就将一直效忠于它
int &rodents = rats;
int* const pr=rats
用做形参的时候:
void swapr(int &a,int &b)
{
int temp;
temp=a;
a=b;
b=temp;
}
int main()
{
int a=3;
int b=4;
swapr(a,b);
cout<<a<<" "<<b<<endl;
return 0;
}
输出的结果会是 4 3
因为传递引用变量函数将直接操作原始数据
即通过引用变量来操作内存中的数据
而没有生成新的变量来存放参数的值
通过引用变量往往可以达到返回多个参数的效果
double re(double &i)
{
i++;
return i;
}
临时变量、引用参数
考虑下面的代码
double side=3.0;
double *pd=&side;
double &rd=side;
long edge=5L;
double lens[4]={2.0,5.0,10.0,12.0}
double c1=re(side);
double c2=re(lens[2]);
double c3=re(rd);
double c4=re(*pd);
double c5=re(edge);// 将会产生临时变量,函数结束释放
double c6=re(lens);//将会产生临时变量,函数结束释放
double c7=re(side+7.0)//将会产生临时变量,函数结束释放
为什么会这样呢?edga虽然是变量,类型却不正确,lens 同上,side+7 类型正确但是没有名称,在这些情况下
,编译器都会生成一个临时匿名变量,让形参指向它。这临时变量会随着函数的结束释放
如果接受引用的参数的意图是修改作为参数传递的变量,则创建临时变量将阻止这个意图的实现。
解决方法是,禁止创建临时变量
2.为何有些函数要返回引用
传统返回机制于按值传递函数参数类似:计算关键return 后面的表达式,并将结果返回给调用函数。
返回一个引用而不是返回一个结构或者类的好处是,返回类或者结构将把整个结构复制到一个临时位置,再将
这个拷贝到接受返回数据的变量指向的空间。但返回值是引用的时候,直接把变量指向的地址赋值为函数返回
的地址,其效率更高
返回引用是需要注意的问题
返回引用最重要的一点是,应避免返回函数终止时不再存在内存单元引用。即不可以返回临时变量,因为临时变量在
函数结束时会自动释放。
为避免这种问题:
最简单的方法是,返回一个作为参数传递给函数的引用。
structs &name(struts &target,const structs &soure)
{
code.......
return target;
}
另一种方法是用new来分配新的存储空间
string & cstr()
{
string *str=new string("15");
return *str;
}
使用引用参数的主要原因有两个
1.程序员能够修改调用函数中的数据对象
2.通过传递引用而不是整个数据对象,可以提高程序运行速度
当然指针也能达到这种效果,那么什么时候用指针什么时候用引用呢?
对于使用传递的值而不做修改的函数
1.如果数据对象很小,如果内置数据或小型结构,则按值传递。
2.如果数据的对象是数组,则用指针,因为这是唯一的选择,并将指针声明为指向const的指针
3.如果市局对象是较大的结构,则使用const指针或者const引用,可以提高程序的效率,也可以
节省复制结构所需的空间
4,如果数据是对象类,则使用const引用.类的设计的语义常常要求使用引用,这是c++新增这项特性(引用)
的主要原因
对用修改函数中数据的函数
1.如果数据是内置数据类型,则用指针。
2.如果数据是数组,则只能用指针
3.如果对象是结构,则使用引用或指针
4.如果数据对象是类的对象,则使用引用
当然这是一些知道原则,很有可能有充分的里有做出其他选择
相关文章推荐
- 关于c++的引用和指针(&,*)
- 关于指针、const、typedef、作用域::、引用&的一些理解
- 关于C++引用的一些注意点
- C++源文件的后缀名问题(关于.h,.hh,.hpp,hxx . .cpp,.c,.cc,.cxx 一些小知识)
- 关于#include中的C++头文件的一些知识
- c++ 关于引用 &的进一步理解
- 关于C++ 引用<初学写代码小记>
- 关于C++引用的一些注意点
- C/C++一些特殊关键字的作用&指针和引用的区别
- 关于c->c++过渡的一些小细节
- C++三种参数传递方法(值传递、指针传递、引用传递)的一些知识
- c++关于类型强转后作为引用参数的一些问题
- 关于C++中引用&问题
- 关于C++引用的一些分析
- C++中关于字符串的引用一些整理
- 关于笔试题中C++的一些基础知识
- c++关于引用和const的一些问题
- 关于c++中位运算&0xff的一些理解
- C++关于引用的小知识
- 关于const引用、常量指针、指针常量的一些知识