&操作符常见用法

来源:互联网 发布:u盘之家淘宝店 编辑:程序博客网 时间:2024/06/14 04:19

一种是按位与 1 & 2 = 0
一种是取地址int* p = &a;
一种是声明引用,相当于定义变量别名:

int a = 3;
int& b = a; // b是a的引用,a,b是同一个变量
b = 4; // a也变化为4
int c = 2;
b = c; // 是赋值给b或a,而不是把b作为c的引用,引用一旦被声明,引用对象不可更改

引用的实质是指针的简化运用版,上面的代码等价为:
int a = 3;
int* const b = &a; // 常指针,b的位置不能更改,相当于引用不能更改自身的引用对象
*b = 4;

所以引用省去了声明时的取地址操作和对变量内存地址引用时的解引用操作,而且引用不能随意被更改,站在指针的角度上说,引用的意义等价于一个常指针,也就是不能改变自己指向位置的指针。

引用在作为参数传递的时候,传递的是实参本身,c++里面类设计经常要传递整个类作为参数,但如果在不必要的时候使用传统的按值传递,效率损失可见一斑:
class foo {
public:
....
int a;
double b;
string c;
};
void bar(foo f) { //输出abc }

比如这个函数bar,传参的时候是按值传递,也就是实参的所有数据被重新复制到参数f里,构造了一个新对象f,它只是输出参数f的abc成员,所以必要重新构造一个临时对象f,这样造成了效率的损失,解决方法有2种:
void bar1(foo* f){ cout << f->a << f->b << f->c; }
var bar2(foo& f) { cout << f.a << f.b << f.c; }

这2种方式的运作机制是相同的,但是后者要更简洁和优美一些,特别是在操作多层间接指针的函数里面,直接使用指针的话,过多取地址&和解引用*容易造成代码混乱,降低可读性。

原创粉丝点击