C++中的引用变量、默认参数和函数重载

 

一.引用变量

引用变量讲得通俗一点就是变量的别名。下面将讲解如何使用引用变量,我这里将使用一个实例:int a=2;int &b=a;

在上面的定义中,首先定义了一个整形的变量a,同时赋值给它为2;然后又定义了一个引用变量b(注意了不要与c中的取地址操作符搞混淆了)。下面将讲解它的使用方法。在完成以上的定义之后,b就是a的别名,并且会一直伴随a的存在而存在。也就是说,此时a=b=2。这时,有人会问了,那么a和b是同一个值吗?那我告诉你,其实它们就是一个值。如果你打印cout<<&a<<<&b<

现在,你又定义了一个变量,同时赋值给它:int c=3;然后再完成一次赋值,a=c;该语句的效果就是将a的值变成3,注意了,此时的b的值夜变成了3。但是如果你想知道a、b、c三个值的地址的值。你会发现,c的地址与a、b的地址的不同的,而空间中值已经变成完全一样。

二.按引用传递函数参数

引用通常被用做函数参数,使得函数中的变量名成为调用程序中的变量的别名。这种传递参数的方式称为按引用传递。

在这里,我将以我们最常见的交换两个变量的值这个函数作为实例:

 

 


void swapr(int & a,int & b);    #1
void swapp(int * p,int * q);    #2
void  swapv(int a,int b);    #3
 
 

在之前的c语言的学习中,我们最常见的就是第2和第3个函数,其中第1个就是我们上面刚讲的按引用传递函数的方法。对于第2个函数,我们知道,是函数指针的使用,在该子函数中如果调换两个实参的值的话,则最终的结果会真的改变,但是在第3个函数中,在程序执行的时候,子函数将实参做了一份copy,然后做交换处理,等到子函数结束的时候,原先的两个实参没有得到真正的互换。下面,我们看一下引用传递参数的使用方法:

如果我定义了两个int变量:int m=3,n=4;

然后调用函数1,swapr(m,n),在这里a其实就是m的引用(别名),b就是n的引用(别名),它在子函数中没有对实参进行拷贝,实际操作的数据就是原先的数据

,所以传递进去的数据发生了真正的互换。

在这里,我们就会提出了一个问题。如果采用了引用传递的方式,然后传递给函数的数据我们是不想修改它的,那应该怎么办呢?这里我们就会采用const的方式。

const的使用分为传递进去的参数和返回的值。

我们举一个例子:const sysop & use(const sysop & sysopref);其中sysop是一个结构体,函数名称是use。其中参数是const,返回值是一个const。参数是const的意思是指参数不会在子函数的调用过程中改变;返回值是const,意思是指函数返回之后,不能再对结构中的成员数据直接赋值。

在上面的实例中我们可以看到,函数的返回值是sysop &,即返回值也是引用。引用作为返回值的作用:通常情况下,是需要将返回值复制到临时变量中的,然后程序去访问,否则,返回引用的话直接访问返回值,不需要去copy。

我们再看一个实例,定义了一个子函数:

 


const sysop & clon2(const & sysopref)
{
      sysop newgug;//定义了一个临时的变量结构体
      newgug=sysopref;//将引用的值赋值给临时变量
      return newgug;
}
  
  

以上的定义是错误的,因为在子函数中,newgug是临时变量,在调用子函数结束的时候,临时变量就消失了,而上面的程序中,它将临时变量作为返回值,一定会是程序崩溃。

我们可以这样定义:

  
  
const sysop & clon(const & sysopref)
{
        sysop * psysop=new sysop;//创建一个新的区域     
       * psysop=sysopref;//将引用的值赋值给临时变量
         return * psysop;
}
   
   

因为创建了一个新的内存空间来存放,所以可以实现,但是在调用完成之后,我们需要delete来释放内存。

 

三.默认参数

默认参数是指当函数调用中省略了实参时自动使用的一个值。

带参数的列表的函数,必须从左到右添加默认值,即一个默认值的右边的每一个变量必须都有默认值。

这里,我们顺便将一些new和delete的使用方法,还是用实例来讲解:

new:char * ps=new char【n】//该语句的功能就是创建了一个n个字符的空间,同时返回这个空间的指针ps;

delete:delete 【】 ps;在使用了new之后,必须使用delete来讲内存空间释放

四.函数重载

函数重载的关键是函数的参数列表-------也称为函数特征标。这里我们主要记住几点:

1)编译器将类型引用和类型本身视为同一个特征标

2)匹配函数,并不区分非const和const变量

3)请记住,是特征标,不是函数类型使得可以对函数进行重载

五.函数模板

函数模板是通用的函数的描述,也就是说他们使用通用的类型来定义函数,其中的通用的类型可以用具体的类型(int、double)替换。

定义模板的方式:

template//其中T是程序员自己定义的一个,根据自己的喜好来定义,只要符合c++的规则就可以

void swap(T & a,T & b);

假如说,通用的这个函数的功能只适合于交换两个数的值,但是现在又了两个结构体,然后需要交换结构体里面的两个值,现在值钱定义的函数完全不能满足,那么怎么办呢?所以,我们就提出了显示具体化的概念,定义的方式如下:

template <> void swap (job &,job &);其中job是需要用到的结构体;

注意:书中还在这里提到一个概念就是显示实例化,何为实例化呢?void swap(int &,int &);也就是说,在调用该函数的时候,我们传递的参数是整形的,记住,与显示具体化的区别就在于之前的那个<>.

 
 
 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值