C++引用

97 阅读3分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第1天,点击查看活动详情

关键问题一、传递引用与传指针、传值的区别?

    1. 值传递 (pass by value),指针传递(pass by pointer),当发生函数调用时,需要给形参分配存储单元、当传递是对象时,要调用拷贝构造函数。 而且指针最后析构时,要处理内存释放问题

    2.引用传递(pass by refenrence),在内存中没有产生形参。效率大大提高!也不用处理指针的析构问题。如果传递数组的话需要整个拷贝,而引用不需要。

 int a;    int &ra=a; //定义引用ra,它是变量a的引用,即别名

说明:

(1)&在此不是求地址运算,而是起标识作用。

(2)类型标识符是指目标变量的类型。

(3)声明引用时,必须同时对其进行初始化。

(4)引用声明完毕后,相当于目标变量名有两个名称,即该目标原名称和引用名,且不能再把该引用名作为其他变量名的别名。

ra=1; 等价于 a=1;

(5)声明一个引用,不是新定义了一个变量,它只表示该引用名是目标变量名的一个别名,它本身不是一种数据类型,因此引用本身不占存储单元,系统也不给引用分配存储单元。故:对引用求地址,就是对目标变量求地址。&ra与&a相等。

(6)不能建立数组的引用。因为数组是一个由若干个元素所组成的集合,所以无法建立一个数组的别名。

数组引用

引用即别名
这样比指针传地址方便多了
形参中的(&a)[10]可以就看做a数组的别名,肯定要指定数组大小,如果没有后面的数组大小,编译器不能知道是变量还是数组

普通传值和引用传值对比:

数组普通传值:a-->a[10]      (或a[])
数组引用传值:a-->(&a)[10] a-->vector&a
变量普通传值:a-->a
变量引用传值:a-->(&a)

  C++数组的引用:
  引用即别名
  这样比传地址方便多了 
  形参中的(&a)[10]可以就看做a数组的别名,肯定要指定数组大小,如果没有后面的数组大小,天知道是变量还是数组 
  普通传值和引用传值对比: 
  数组普通传值:a-->a[10]    (或a[]) 
  数组引用传值:a-->(&a)[10]   a-->vector<int>&a
  变量普通传值:a-->a
  变量引用传值:a-->(&a) 

 #include <iostream>
 using namespace std;
 
 void test(int a[10]){// 数组普通传值,用于打印数组a的值 
     for(int i=0;i<10;i++)
     {
         printf("%d ",a[i]);
     }
     printf("\n");
 } 
 void readData(int (&a)[10]){//数组引用传值:将a数组赋值为0--9 
     for(int i=0;i<10;i++)
     {
         a[i]=i;
     }
 }
 void printData(int (&a)[10]){//数组引用传值:用于打印数组a的值 
     for(int i=0;i<10;i++)
     {
         printf("%d ",a[i]);
     }
 }
 int main(){
     int a[10]={0}; //为a数组中的每一个赋初值为0
     test(a); // 数组普通传值,用于打印数组a的值 
     readData(a);//数组引用传值:将a数组赋值为0--9 
     printData(a);//数组引用传值:用于打印数组a的值 
     
     return 0;
 }