首页 > 代码库 > C++Primer 学习笔记之指针和引用

C++Primer 学习笔记之指针和引用

1、引用概念
引用引入了对象的一个同义词。定义引用的表示方法与定义指针相似,只是用&带起了*。
例如:Point pt1(10,10);
Point &pt2 = pt1;//定义pt2为pt1的引用。通过这样的定义,pt1和pt2表示同意对象,需要特别强调的是引用并不是产生对象的副本,仅仅是对象的同义词。因此,当下面的语句执行后:
pt1.ofset(2,2);
pt1和pt2都具有了(12,12);
引用必须在定义的时候马上初始化,因为它必须是某个东西的同义词。你不能先定义一个引用后才初始化它。例如下面是非法的:
Point &pt3;
pt3 = pt1;
2、引用简介
引用就是某一个变量(目标)的别名,对引用的操作与对变量直接操作一样。
引用的声明方法:类型标识符 &引用名 = 目标变量名
例如:
int a;
int &ra = a;//定义引用ra,它就是变量a的引用,即别名。
说明:
(1)&在此不是球地址运算,而是起标示作用。
(2)类型标识符是指目标变量的类型
(3)声明引用时,必须同时对其进行初始化
(4)引用声明完毕后,相当于目标变量有两个名称,即目标原名称和引用名,且不能再把引用名作为其他变量的别名。
ra =1;等价于a=1;
(5)声明一个引用,不是新定义一个变量,它之表示该引用时目标变量名的一个别名,它本身不是一种数据类型,因此引用本身不占存储单元,系统也不会给引用分配存储空间;所以对引用球地址就是对目标变量球地址。&ra =与&a相等。
(6)不能建立数组的引用。因为数组是一个有如干元素所组成的集合,所以无法建立一个数组的别名。
3、引用的应用
引用的一个重要作用就是作为函数的参数。以前的C语言中的函数是值传递,如果有大块数据作为参数传递的时候,采用的方法往往是指针,因为这样做可以避免将整块数据全部压栈,可以提高程序的效率。但是现在(C++)中有增加了一种同样的有效率的选择,就是引用。
例如:
void swap(int &p1,int &p2)
{
   int  p;
   p = p1; 
   p1 = p2;
   p2 = p;
}
int  main()
{
    int a,b;
    cin>>a>>b;
  swap(a,b);
  cout<<a<<b<<endl;
}
4、指针与引用的差异
   1)定义引用时没有初始化是错误的。
   2)给引用赋值修改的是该引用所关联对象的值。(指针 存储的是它指向的变量的地址。解引用, 就是引用它指向的变量的值。引用本身就是目标变量的别名

[cpp] view plaincopy

 string str("hello world");
 string &rstr1;      //ERROR
 string &rstr2 = str;
 rstr2 = "nihao shijie";
 cout << str << endl;

     int ival = 1;
     int ival2 = 2;
     int &r1 = ival,&r2 = ival2;
     r1 = r2;
     cout << r1 << endl;
     cout << ival << endl;
4、具体可以参考博文讲解的很详细
http://www.360doc.com/content/13/0121/19/3398926_261617220.shtml