【引用】,就是一个变量的别名(连内存都不分配)。 引用是C++里定义的(C没有,&只是取地址操作)。
可以看成是一个 const 指针 (指针地址不可变,指向的内容可变)。
【指针】,就是一个变量,是一个占用四字节的变量(32位机上),与其他变量的不同之处就在于它的变量值是一个内存地址,指向内存的另外一个地方。
引用 与 指针 的区别:
- 引用必须在声明的同时初始化(且非NULL) 而指针不必。
- 引用不可改变(是谁的别名就是谁),引用所指对象的值可以改变。 指针随便改(指针的值,指针所指对象的值)
- 引用不分配内存 指针在声明时就要分配
结论:对于 int& a; 引用实际是一种隐式指针,是方便编程而引入的,识别由编译器支持。 /* 其实引用&是一个能自动被编译器逆向引用的常量型指针
【两大作用】: /* 作为函数的参数,用于提高效率(如常量入参,返回类的成员变量的值)、返回数据...
/* 简化代码,使代码易读。 比如: 要使用 a->b->c->d->e->f->g,g是一个多重嵌套类中的一个整数成员,书写很麻烦,也容易错。
/* 这时int &z =a->b->c->d->e->f->g;
/* 以后直接使用z,因为他们的存贮单元本来一致,所以也根本没有效率的损失。
【引用】与【取地址】:
只有 在”变量 声明/定义“ 或 ”函数 声明/定义“ 中, &var 代表引用。
在表达式中, &var 指 取地址
【对象存在时,&就是取地址;不存在时,&就是在定义引用】
声明/定义的时候,int& var 就是通知编译器,这个参数是”传引用方式“传递。
用的时候 func(a) 就是在 传引用 调用了! 不是说func(&a)叫传引用!!! //经常误解
【*和& 相互对偶】:
* 两个作用: 1。 声明指针 2。 解引用
& 两个作用: 1。 声明引用 2。 取地址
使用 引用 的几个注意事项:
-
为了简化代码使用引用时,要注意内存泄露。比如 Class& ref = *ptr;也许这个的引用可以使你感觉更舒服的使用Class:
/* 如ref.function(); 而不必 (*ptr).function(); 或ptr->function();
/* 可是相比之下,一个严重的问题来了:内存泄露..
/* 因为引用不像指针那样明显:你很可能忘记:delete &mcref; -
自定义类型中的成员变量 如果有引用 , 拷贝赋值时,编译器会拒绝。 因为不能用一个引用给另一个引用赋值(就是说,不能让引用改指向不同对象 //effective C++ 05条款 )