首页 > 代码库 > 复杂引用

复杂引用



1.通过引用来引用数组(一维数组)

#include<iostream>

#include<stdlib.h>

 

/*引用就是给原来的变量有一个别名同一个地址*/

voidmain()

{

   inta[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };

   int(&ra)[10](a);

   inti = 0;

   for (autodata:ra) //C++11的循环

   {

       data =i + 5;

       std::cout << data <<std::endl;

   }

   std::cout << a <<" " <<ra <<std::endl;

   std::cout << &a <<" " << &ra << std::endl;

 

   system("pause");

}

2.引用二维数组的方式

#include<iostream>

#include<stdlib.h>

 

voidmain()

{

   inta[2][5] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };

   //引用就是给原来的变量有一个别名同一个地址

   int(&ra)[2][5](a);

   for (inti = 0;i < 2;i++)

   {

       for (intj = 0;j < 5;j++)

       {

           std::cout << " " <<ra[i][j];

       }

       std::cout << "\n";

   }

 

   std::cout << a <<" " <<ra <<std::endl;

   std::cout << &a <<" " << &ra << std::endl;

 

   system("pause");

}

 

3.引用函数指针

#include<iostream>

#include<stdlib.h>

 

intjia(inta,intb)

{

   returna +b;

}

 

intjian(inta,intb)

{

   returna -b;

}

 

//函数指针int (*rp)(int a,int b)

voidchange(int(* & rp)(int,int))

{

   rp =jian;

}

 

int(*&changep(int(*&rp)(int,int)))(int,int)

{

   rp =jian;

   returnrp;

}

 

voidmain()

{

   int(*p)(inta,intb)(jia);

   std::cout << p(1, 2) <<std::endl;

   change(p);

   std::cout << p(1, 2) <<std::endl;

 

   std::cout << "-----------------------" <<std::endl;

   p =changep(p);

   std::cout << p(1, 2) <<std::endl;

 

   system("pause");

}

4.数组中的元素不能为引用

5.引用的本质是指针,直接sizeof引用,就是引用的数据大小,引用变量占据4个字节

#include<iostream>

 

classMyClass{

   char &a;

   char &b;

   char &c;//引用的本质是指针,直接sizeof引用,就是求引用的数据大小

   //引用变量占据4个字节

};

 

voidmain()

{

   intnum = 10;

   int &rnum(num);

   doubledb = 10.9;

   double &rdb(db); //直接作用引用的变量

 

   std::cout << sizeof(rnum) << std::endl;

   std::cout << sizeof(rdb) << std::endl;

   std::cout << sizeof(MyClass) << std::endl;

   system("pause");

}

运行结果如下:

 

 

 

#include<iostream>

 

int getdata(int && num)//右值引用,节约内存拷贝,内存优化所必须

{

   std::cout << num <<std::endl;

   num += 10;

   returnnum;

}

 

void main7()

{

   inta = 5;

   intb = 4;

 

   std::cout << getdata(a + 1) << std::endl;

   system("pause");

}

 

//左值,一般可以取地址就是左值

//右值某些情况可以,某些情况不可以

voidmain8()

{

   inta = 3;

   intb =a + 1;//右值->左值

   std::cout << getdata(std::move(a)) << std::endl;

   //std::move将左值转换为右值,C++11

}

voidmain9()

{

   //const int num(6);

   charstr[10]("hello");//限定字符串不被修改

   constchar *pc(str);//指向常量的指针限定了指向的数据无法修改,+1+2+3

   str[3] =‘x‘;//可以,

   //pc[3] = ‘y‘;

   //*(pc + 3) = ‘y‘;

   pc ="world";

   system("pause");

}

 

voidmain10()

{

   charstr[10]("hello");

   constchar(&rstr)[10](str);//常量引用

   constchar(&rrstr)[10](rstr);//引用可以给另一个引用初始化

   str[4] =‘X‘;

   //rstr[4] = ‘Y‘;

}

 

void main11()

{

   int(*p)(inta,intb)(jia);

   std::cout << p(1, 2) <<std::endl;

   int(*const &rp)(inta,intb)(p);//引用函数指针

   //rp=jian;//()仅仅适用于初始化

}