注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

Mihooke's blog

IT之恋

 
 
 

日志

 
 

数组引用、模板函数、函数重载的一个综合实例  

2014-10-08 15:34:48|  分类: C++ |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

今天看《C ++ Primer》的引用部分,书上说如果数据对象是数组,只能使用指针进行引用操作(P274)。但是网上看到可以对数组进行引用操作,于是自己亲自写了个程序实验了下,发现还是可以的,不过要在声明的时候用格式:

(&arr)[arr_size]


具体看下面的代码,这个代码综合了模板函数、函数重载和数组引用,把这个程序搞懂了,这些知识也就掌握了一大半:

#include <iostream>


template <typename T>

void sswap(T a,T b); //普通模板函数声明


const int LIMIT=10;


template <typename T>

void sswap(T (&a)[LIMIT],T (&b)[LIMIT],int n);//数组引用


void show(int a[]);

 

int main()

{

    using namespace std;

    int i=10;

    int j=20;

    cout<<"i,j:"<<i<<","<<j<<endl;

    sswap(i,j);

    cout<<"after swap,i,j:"<<i<<","<<j<<endl;

    

    int arr1[LIMIT]={0,1,2,3,4,5,6,7};

    int arr2[LIMIT]={7,6,5,4,3,2,1,0};

    cout<<"arr1,arr2 :"<<endl;

    show(arr1);

    show(arr2);

    sswap(arr1,arr2,LIMIT);

    cout<<"after swap,arr1,arr2:"<<endl;

    show(arr1);

    show(arr2);

    system("pause");

    return 0;

}

template <typename T>

void sswap(T a,T b)

{

     T temp;

     temp=a;

     a=b;

     b=temp;

}

template <typename T>

void sswap(T (&arr1)[LIMIT],T (&arr2)[LIMIT],int n) //与声明一致

{

     T temp;

     for(int i=0;i<n;i++)

     {

             temp=arr1[i];

             arr1[i]=arr2[i];

             arr2[i]=temp;

     }

}

void show(int a[])

{

     using namespace std;

     for(int i=0;i<LIMIT;i++){

             cout<<a[i];

     }

     cout<<endl;

}

运行结果如下:

数组引用、模板函数、函数重载的一个综合实例 - mihooke - mihooke的博客

 可以看到,结果按照程序实现了交换,可以这么理解引用:假如引用一个变量,把这个变量的值直接放到引用它的地方使用,就相当于在使用原先的变量,如果对该引用变量进行修改,那么原来变量的值也会随之改变。


结构引用如果函数调用的参数不是左值或与相应的const引用参数类型不匹配,那么c++将创建类型正确的匿名变量,然后将函数调用的参数传递给该匿名变量,并让参数来引用该变量。出现临时变量的情况是当且仅当函数参数为const引用时。在使用引用时尽可能使用const

struct mihooke {...};

mihooke & function (mihooke & aa,const mihooke & bb){return aa;}

function前面那个 很关键,表示function返回类型也是引用,可以用返回值作另一个函数的参数,即返回的aa结构是mihooke的引用类型;如果没有这个&,那么函数返回的就是aa的一个拷贝。

还有一点必须要注意的是,引用返回值可以作为左值给它赋值,而常规函数的返回值都是右值。举个栗子:function(aa,bb)=cc;

意思是,function函数返回的aa的引用后,再用结构cc的值赋给aa。如果不想被赋值呢,可以让function返回值为const,这样function就不能被修改了。如下:

const mihooke & function (mihooke & aa,const mihooke & bb){return aa;}

  评论这张
 
阅读(75)| 评论(1)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017