&操作符浅析
& operator用法
1. &地址操作符
&可以获取C++中基本类型,结构,累,集合类型的地址 . 下面一个例子中, &操作符取得数组nArray中第三个元素的地址
// Example of the address-of operator
int *pPtr;
int nArray[20];
pPtr = &nArray[2];
2. & Bit与操作符
&操作符把两个数据进行按位与操作 .
// Example of the bitwise-AND operator
int nNumA=1, nNumB=3, nNumC; // 00000001, 00000011
nNumC = nNumA & nNumB; // nNumC is now 1
3. &做为引用操作符的最基本用法:
用在函数参数的传递中. C++函数参数传递有三种方式. 值,指针,引用 . 引用在存储方面表现的像指针,引用也是保存着对象(object)的地址 . 但是与指针方式不同的是 , 引用在使用方面表现的像值传递 . 下面是一个基本的例子:
void AddIt(int& x)
{
x += 2;
}
int x;
x = 3;
AddIt(x);
printf("%d, x) ; // the value of x is now 5
4. 函数返回,引用传递代替值传递
如果函数返回值是一个对象,有些场合用 ‘引用传递’代替’值传递’可以提高效率 .
String & String::operate =(const String &other)
{
// (1) 检查自赋值 // 4分
if(this == &other)
return *this;
// (2) 释放原有的内存资源 // 3分
delete [] m_data;
// (3)分配新的内存资源,并复制内容 // 3分
int length = strlen(other.m_data);
m_data = new char[length+1]; // 若能加 NULL 判断则更好
strcpy(m_data, other.m_data);
// (4)返回本对象的引用 // 3分
return *this;
}
对于赋值函数,应当用”引用传递”的方式返回String对象.如果用’值传递’的方式,虽然功能仍然正确,但是由于return语句要把*this拷贝到保存返回值的外部存储单元之中,增加了不必要的开销,降低了赋值函数的效率 .
String a,b,c;
…
a = b; // 如果用“值传递”,将产生一次 *this 拷贝
a = b = c; // 如果用“值传递”,将产生两次 *this 拷贝
5. 指针的引用
对于C + +中的引用,语法清晰多了。函数参数变成指针的引用,用不着取得指针的地址。通过运行下面的程序,将会看到指针本身增加了,而不是它指向的内容增加了。
Void increment(int*& i){i++;}
Main()
{
int* i=0;
cout<< “i=”<<i<<endl;
increment(i);
cout<<”i=”<<i<<endl;
}
6. 函数参数使用 const &
因为函数如果是值传递的话 , 函数会先构建一个临时对象,这会消耗一定的时间(构造函数,析构函数) . (当然int , bool这种基本数据类型除外) . 所以我们参数传递使用const & , 可以省去临时对象的构造和析构过程,从而提高的效率 .
参考资料
ü MSDN
ü 高质量C++编程 (林锐)
ü C++ Primer 3rd Edition
ü Thinking in C++