《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是一个数组的引用,数组的成员不可改变
//推荐
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是一个数组的引用,数组的成员不可改变
//推荐
相关文章推荐
- 学习笔记——Maven settings.xml 配置详解
- C++ const引用、临时变量 引用参数详解
- 详解c++指针的指针和指针的引用
- [置顶] WindowsPhone控件详解及引用外部控件Silverlight Toolkit
- Android studio中生成引用.aar和.jar的方法详解
- Java强引用、软引用、弱引用、虚引用详解
- 详解Block: block循环引用
- eclipse 配置spring IDE详解(配置好以后可以查看bean的依赖关系,很清晰。而且在xml中写bean的时候可以自动提示引用类路径等)
- java 父类引用指向子类对象---动态绑定之易错点详解
- 【C++ Primer】C++输入cin详解
- C++ 中引用与指针的区别实例详解
- 详解值传递和引用传递
- [引用]java多线程学习-java.util.concurrent详解(四) BlockingQueue
- Java多态性详解——父类引用子类对象-2
- 《Java编程思想》学习笔记10——反射机制详解
- Java多态性详解——父类引用子类对象
- Java对象的强、软、弱和虚引用详解
- C++ primer 详解派生类向基类转换的可访问性
- C#详解值类型和引用类型区别
- 《c++ primer》学习笔记——泛型算法