今天开始就要进行一个月的嵌入式的培训了。
第一天,复习下C语言的基础知识,老师问了一个关于关键词const的问题。我被提问到,于是我就大致说了一下,估计他也没听懂。
快下课的时候老师写了两行代码,然后什么也没说,直接说这样可以这样不可以。估计他也没懂。
例子是<<C++ Primer>> P49关于const引用的问题。
两行代码:
1. int &i = 1024; // error
const int &i = 1024; // ok, const reference
2. double dval = 3.1416;
const int &ref = &dval;
两个例子很明确了,C++ Primer也有解释,我们常说的const引用是指 “指向const的引用”,而非const引用是指“指向非cosnt的引用”,第一个例子1024是一个常量,所以必须用const引用。
也就是说,const引用可以指向const变量或者非const变量,而非const引用只能指向非const变量。
第二个例子,C++ Primer也解释了,存在一个隐士转换,实际代码为:
int temp = dval; // 隐士转换
int &ref = temp;
这样就可以看出,第二个就存在我们不希望的结果,引用是一种别名,当我们用ref来试图修改dval的值时就会发现结果并不是我们想像的那样子了。问题所在。
我以为上述代码不常用,但是实际下午在看《C++ 标准程序库》的时候写了几行代码,关于模板的,比如我们在写这样一个template:
template <typename T>
const T& max(const T &a, const T &b )
{
if( a < b )
return b;
else
return a;
}
然后我们在main函数里调用这个模板
int main()
{
cout << max( 10, 20 );
return 0;
}
这样,实际调用即
const int & max( cosnt int &a, const int &b ){}
我们发现这里的参数即为引用,而且调用的时候直接传递常量,比如上面的max( 10, 20 ),参数就变成了
int &a = 10, int &b = 20, 首先不说一个不修改参数的函数参数应该定义为cosnt,问题是如果不把参数定义为const,编译器(gcc version 3.4.5 (mingw-vista special r3))就会给出以下错误提示:
error: invalid initialization of non-const reference of type ‘int&’ from a temporary of type ‘int’
及时不是模板的编写,简单的函数定义,也会有上面的问题。
所以。。。。
Related posts:
- C++ STL 学习笔记 – 简介 1、始于1989年,1997年完成,历时大约10年,标准程序库是C++标准规格的一部分,提供一些列的核心组件,用以支持IO、字符串、容器(数据结构)、算法(排序搜索合并等)、国别等主题。 2、不同组件背后有不同的设计理念,比如String class和STL差别,后者是一个数据结构和算法的Framework,String class是被设计为安全易用,接口不言自明,并可以做许多错误检测,而STL的设计目标是将不同的算法和数据结构结合在一起,并获取最佳的效率,所以并不是很方便,也不检验许多逻辑错误,所以必须通晓其概念原理才可以有效使用。 二、Template模板 1、Nontype Template 参数(非型别模板参数) 型别(type)可以作为Template的参数,非型别(nontype)也可以,比如bitset<>, 其中bit的位数以Template参数指定,...
以上关联文章由 Yet Another Related Posts Plugin 提供支持。
Tags: C++ const 引用
Many thanks.