您的位置:首页 > 编程语言 > C语言/C++

《C++ primer》学习笔记之二十:引用详解1、2、3

2006-04-14 01:22 357 查看
19.1 当引用定义完毕后,它就是另外一个变量的别名,以后使用变量和使用变量的别名效果一样。
int i = 1;
int &ri = i;
i = 2;
cout << i << " " << ri << endl; //输出:2 2
ri = 3;
cout << i << " " << ri << endl; //输出:3 3

19.2 当函数的参数为引用时:
1. 最简单的情况:
void f(int &i) { cout << i++ << endl; }

int main()
{
f(1); //error: 无法将参数1从int转为int &。原因见4

int i = 1;
f(i); //ok
}
2. 重载时会将引用考虑进去。但可能和非引用产生冲突:
void f(int &i) { cout << i++ << endl; }
void f(int i) { cout << ++i << endl; } //Ok. 重载f(int &)

int main()
{
f(1); //Ok. 调用f(int)。(提醒:在上例1中这句话是错的)

int i = 1;
f(i); //error.对重载的调用不明确

int &ri = i;
f(ri); //error.对重载的调用不明确。
//虽然ri为i的一个引用,但使用起来却无法和i区分开来
}
3. 当引用碰到const:
int i = 1;
int &ri = i;
int const &const_ri = i; //ok. const_ri是一个int不变量的引用,其值不可改变
int & const const_ri2 = i; //ok. const_ri是一个int变量的不变引用,其值可以改变
//实际上:一个引用一旦定义(定义时必须初始化),它就只能是一个变量的引用,不能改成其它变量的引用
//这个定义和int &ri = i;语义是一样的

ri = 2;
cout << i << " " << ri << " " << const_ri << " "<< const_ri2 << endl; //输出: 2 2 2 2
//注意:const_ri的值变了,因为它与其它变量都占据同一块内存
const_ri = 3; //error.不能改变一个const量的值

const_ri2 = 4; //ok.这是个有意思的的方。注意const_ri2与ri有相同的语义。
cout << i << " " << ri << " " << const_ri << " "<< const_ri2 << endl; //输出: 4 4 4 4

int j = ri;
j = 5; //没有改变ri的值,因为j和ri占据两块不同的内存区域

所以,引用修饰符'&'应该与引用名放一起,不要在中间多余地加一个const。
int const &const_ri这个定义法很常见。
4. rvalue不能用来初始化引用变量,但可以初始化const引用变量:
rvalue:当常量作为参数调用函数时,常量为rvalue
当函数的返回值不是引用时,返回值为rvalue
看下面:
void test(int &i) { cout << i << endl; }
void test(int const &i) { cout << "const " << i << endl; }
int value(int i){ return i; }

int main()
{
test(1); //输出:const 1

test(value(2)); //输出:const 2

int i = 3;
test(i); //输出:3. 当没有test(int &)时调用test(int const &)
}
最重要的是:引用在使用前必须初始化,这是它和指针的最大区别。

19.3 当引用碰到const和数组:
int ary[] = {1, 2, 3, 4};
int (&r_ary)[4] = ary; //r_ary为ary的一个别名(或叫做引用)

//下面这句很糟
int (const &const_r_ary)[4] = ary; //fatal error.这个导致严重的编译器内部错。
//一般的错误,编译器会指出程序错误的原因。但此时,好像编译器自己挂掉了,当然也就无法指出程序为什么错了。但是它指出了在哪条语句处出的错!

int (& const const_r_ary2)[4] = ary; //ok.但将const放在引用符'&'和引用名之间不起任何作用
//此const_r_ary2等效于r_ary

int const (&const_r_ary3)[4] = ary; //ok.const_r_ary3是一个数组的引用,数组的成员不可改变
//推荐
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: