const引用 – 一个C++小问题

   今天开始就要进行一个月的嵌入式的培训了。

   第一天,复习下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:

  1. 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:

One Response to “const引用 – 一个C++小问题”

Leave a Reply