C++之函数参数按引用传递

C++引用与指针的比较

引用是C++中的概念,初学者容易把引用和指针混淆一起。

一下程序中,n是m的一个引用(reference),m是被引用物(referent)。

 int m;

 int &n = m;

n相当于m的别名(绰号),对n的任何操作就是对m的操作。

所以n既不是m的拷贝,也不是指向m的指针,其实n就是m它自己。

  引用的规则:

(1)引用被创建的同时必须被初始化(指针则可以在任何时候被初始化)。

(2)不能有NULL引用,引用必须与合法的存储单元关联(指针则可以是NULL)。

(3)一旦引用被初始化,就不能改变引用的关系(指针则可以随时改变所指的对象),这里指不能再绑定其他的对象,只要不是const,就可以改变值,即可以通过引用改变绑定对象的值,因为它们其实是相同的。

以下示例程序中,k被初始化为i的引用。语句k = j并不能将k修改成为j的引用,只是把k的值改变成为6。由于k是i的引用,所以i的值也变成了6。

 int i = 5;

 int j = 6;

 int &k = i;

 k = j; // k和i的值都变成了6;

引用的主要功能是传递函数的参数和返回值。


内联函数是代码被插入到调用者代码处的函数。如同 #define 宏,内联函数通过避免被调用的开销来提高执行效率,尤其是它能够通过调用(“过程化集成”)被编译器优化。
    内联函数和宏很类似,而区别在于,宏是由预处理器对宏进行替代,而内联函数是通过编译器控制来实现的。而且内联函数是真正的函数,只是在 需要用到的时候,内联函数像宏一样的展开,所以取消了函数的参数压栈,减少了调用的开销。你可以象调用函数一样来调用内联函数,而不必担心会产生于处理宏 的一些问题。


#include <iostream>

using namespace std;



void swap(int &i, int &j){

    i^=j;
    j=i^j;
    i=i^j;
    cout<<"the call function: "<<i<<"\t"<<j<<endl;

}
void print( const int &l){//如果形参是const,实参both。如果实参const,说明实参不能被改动,则形参必须const。

    cout<<"l= "<<l<<endl;

}
void main(){

    int i=3,j=5;
    swap(i,j);
    const int k=6;//定义的同时必须初始化,const int k;k=6;报错
    int &m=i;//引用定义的同时必须初始化,而且要关联到某一类型。int  &m=3报错
    double b=3.0;
    double &a=b;
    //cout<<sizeof(a)<<endl;//引用的sizeof指向其绑定的对象的大小
    char *r;
    //cout<<sizeof(r)<<endl;//指针都是4个字节

    float array[12];
    cout<<sizeof(array)<<endl;//数组的sizeof就是本身类型占用字节数*个数

    //error :&m=j;引用一旦初始化后不可再绑定其他对象
    double n=1.2;
    const int &t=n;//const类型的引用可以绑定到其他类型,而非const类型的引用不可以。。。
//    print(k);
//    cout<<"the main function: "<<i<<"\t"<<j<<endl;
//    cout<<"k= "<<k<<endl;
}
//总结:一般变量想被外部文件使用,直接在引用的地方加上extern就ok了。const变量不行,如果想外部引用,初始化的地方加extern,引用的地方也要加



 

本节主要讲函数调用及参数传递的一些问题。

首先说参数调用,参数调用做了2件事情,用对应的实参初始化函数的形参,并将控制权转移给被调用函数,主调函数的执行被挂起,被调函数开始执行。函数的运行以形参的隐式定义和初始化开始。执行到return的时候,被调函数完成,主调函数在调用处开始恢复执行,并将函数的返回值用作求解调用操作符的结果,继续处理在执行调用的语句中的剩余工作。

 

参数传递

第一种传递方式:值传递

值传递需要复制对应的实参实现初始化,当用实参副本初始化形参时,函数并没有访问调用函数所传递的实参本身,对实参副本的修改也是局部的,函数调用结束就结束了,因此不会修改实参的值。

引用传递:

因为复制实参并不是在所有的情况下都适合,不适合复制实参的情况包括:

当需要在函数中修改实参的值时;

当需要以大型对象作为实参传递时,对实际的应用而言,复制对象所付出的时间和存储空间代价往往过大

当没有办法实现对象的复制时

 

引用形参直接关联到绑定的对象而非对象的副本,必须使用与该引用绑定的对象初始化该引用。引用形参完全以相同的模式工作。在c语言中,人们习惯用指针,在c++中使用引用。

 

使用引用形参返回额外的信息。这个跟上面有些类似,只不过说如果你想要多返回些东西,但是直接又没法返回,那么就借助引用好了,通过引用改变改变实参的值。

 

利用const引用避免复制。这个主要是大型对象的时候,复制代价比较高。比如string。。。

很多时候如果不需要改变值,就加上 const

double fl=1.2;
const double *pl=&fl;//这个是正确的,赋值初始化
*pl=4.3;//error:因为已经是const类型的了,不允许改变值,不过指针pl还是可以指向其他对象的。

double *cosnt plt;这个时候plt是不能更改的。。。

string.h是c语言对应的标准库,在c++里面对应的是<cstring>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值