C++学习笔记1-const引用
2011-04-27 21:57
295 查看
const引用可以用不同类型的对象初始化(只要能从一种类型转换到另一种类型即可),也可以是不可寻址的值,如文字常量,例如:
同样的初始化对于非const引用是不合法的,将导致编译错误。原因如下。
引用在内部存放的是一个对象的地址,它是该对象的别名。对于不可寻址的值,如文字常量,以及不同类型的对象,编译器为了实现引用,必须生成一个临时对象,引用实际上指向该对象,但用户不能访问它。例如,当我们写:
编译器将其转换成:
如果我们给ri赋一个新值,则这样做不会改变dval,而是改变temp。对用户来说,就好像修改动作没有生效。
const引用不会暴露这个问题,因为它们是只读的。不允许非const引用指向需要临时对象的对象或值,一般来说,这比“允许定义这样的引用,但实际上不会生效”的方案要好。
下面给出的例子很难在第一次就能正确声明。我们希望用一个const对象的地址来初始化一个引用。非const引用定义是非法的,将导致编译时刻错误:
下面是在打算修正pi_ref定义时首先想到的做法,但是该定义不能生效。
如果从右向左读这个定义,会发现pi_ref是指向一个定义为const的int型对象的指针,我们的引用不是指向一个常量,而是指向一个非常量指针,指针指向一个const对象。
正确的定义如下:
指针和引用有两个主要区别:引用必须总是指向一个对象。如果用一个引用给另一个引用赋值,那么改变的是被引用的对象而不是引用本身。
double dval = 3.14159; //仅对于const引用才是合法的 const int &ir = 1024; const int &ir2 = dval; const double &dr = dval + 1.0;
同样的初始化对于非const引用是不合法的,将导致编译错误。原因如下。
引用在内部存放的是一个对象的地址,它是该对象的别名。对于不可寻址的值,如文字常量,以及不同类型的对象,编译器为了实现引用,必须生成一个临时对象,引用实际上指向该对象,但用户不能访问它。例如,当我们写:
double dval = 1024; const int &ri = dval;
编译器将其转换成:
int temp = dval; const int &ri = temp;
如果我们给ri赋一个新值,则这样做不会改变dval,而是改变temp。对用户来说,就好像修改动作没有生效。
const引用不会暴露这个问题,因为它们是只读的。不允许非const引用指向需要临时对象的对象或值,一般来说,这比“允许定义这样的引用,但实际上不会生效”的方案要好。
下面给出的例子很难在第一次就能正确声明。我们希望用一个const对象的地址来初始化一个引用。非const引用定义是非法的,将导致编译时刻错误:
const int ival = 1024; //错误:要求一个const引用 int *&pi_ref = &ival;
下面是在打算修正pi_ref定义时首先想到的做法,但是该定义不能生效。
const int ival = 1024; //仍然错误 const int *&pi_ref = &ival;
如果从右向左读这个定义,会发现pi_ref是指向一个定义为const的int型对象的指针,我们的引用不是指向一个常量,而是指向一个非常量指针,指针指向一个const对象。
正确的定义如下:
const int ival = 1024; //OK:这是可以被编译器接受的 const int *const &pi_ref = &ival;
指针和引用有两个主要区别:引用必须总是指向一个对象。如果用一个引用给另一个引用赋值,那么改变的是被引用的对象而不是引用本身。
相关文章推荐
- C++ 学习笔记(2)变量和基本类型(复合类型:引用、指针)、const、constexpr、typedef(using)、auto、decltype
- [C++学习笔记]const引用
- C++基础学习笔记----第六课(const和引用的扩展、重载函数和C方式编译的深入)
- C++学习笔记--再谈const和引用
- C++学习笔记(一)——内存、引用、const
- c++学习笔记-------const限定修饰符和引用
- 【从C到C++学习笔记】引用/const引用/引用传递/引用作为函数返回值/引用和指针的区别
- 学习C++笔记(引用、const、iterator)
- C/C++中关于地址、指针和引用变量的学习笔记(六) : const和void
- VS2010 C++ 学习笔记(六) this指针 const 指针 引用
- C++基础学习笔记----第二课(引用的基础知识)
- C++学习笔记(3):const与&修饰函数形参的作用
- C++学习笔记十四之引用变量&
- C++:const sizeof 及array的学习笔记
- 4000 C++中进化后的const(学习笔记)
- c++学习笔记1(指针和引用)
- C++学习笔记:int sprintf ( char * str, const char * format, ... );
- C++学习笔记(2)之引用详解
- C++学习笔记---引用
- Effective C++ 学习笔记(1) : 语言联邦、弱化预编译器、const、初始化