在C++ primer 5th中,第6章的练习6.39(a)中,关于重载和const形参的学习心得。

练习6.39:说明在下面的每组声明中第二条声明语句是何含义。如果有非法的声明,请指出来。

(a)   int calc(int, int);

int calc(const int, const int);

这题第一眼看下来,肯定是错的啊。这一节课前面刚讲了,一个拥有顶层const的形参无法和另一个没有顶层const的形参区分开来。妥妥的错了。

然后我看了GitHub上的答案,合法??发现答案说的跟我说的不一样。(Exercise 6.39)

(a) legal, repeated declarations(without definition) are legal in C++

做的竟然不对?再去看看中文版的呢。(练习6.39)

(a) 非法。因为顶层const 不影响传入函数的对象,所以第二个声明无法与第一个声明区分开来。

两个答案竟然不一样。

我就尝试使用g++编译代码,看看编译器会有什么提示。

  1. int calc(int, int);
  2. int calc(const int, const int);
  3.  
  4. int main()
  5. {
  6. return ;
  7. }

编译器没有报错,程序可以通过编译。

不是说顶层const会被忽略么?这样就无法区分两个函数的重载。这时候我回去仔细看了英文的意思,这里说,这个声明是合法的,在C++中重复声明(只声明不定义)是合法的。这个时候就懂了,这里,两句话并非是函数的重载,仅仅是重复声明了同一个函数。回到问题,如果有非法的声明。这里的声明肯定是合法的,中文的答案是错误的。再回去仔细看前面讲解重载和const形参的地方,书中只是说重复声明,但是并没有说是错误的。

这个问题仔细说的答案如下:两个声明均合法,但是重复声明了同一个函数,并没有发生函数的重载。

以下代码可以使编译器报错,这里加入了程序块,那么就不是函数的声明,而是定义。但是由于顶层const形参和普通形参相等,那么这里就使用同一种形参定义了两个函数,造成函数重定义。

  1. int calc(int, int){};
  2. int calc(const int, const int){};
  3.  
  4. int main()
  5. {
  6. return ;
  7. } 

错误信息如下

  1. error: redefinition of int calc(int, int)’
  2. int calc(const int, const int){};

重载和const形参的学习心得的更多相关文章

  1. 重载和const形参

    1.int lookup(string p); 2.int lookup(const string p);//同1 3.int lookup(string *);//传入一个指针,指针指向string ...

  2. C++11 Thread多线程的学习心得与问题

    C++11 ,封装了thread的多线程的类,这样对多线程的使用更加方便. 多线程的原理我不加赘述,可以参看操作系统等参考书. 多线程代码可以最大化利用计算机性能资源,提高代码的运行效率,是常用优化方 ...

  3. 我的MYSQL学习心得(九) 索引

    我的MYSQL学习心得(九) 索引 我的MYSQL学习心得(一) 简单语法 我的MYSQL学习心得(二) 数据类型宽度 我的MYSQL学习心得(三) 查看字段长度 我的MYSQL学习心得(四) 数据类 ...

  4. 我的MYSQL学习心得(十六) 优化

    我的MYSQL学习心得(十六) 优化 我的MYSQL学习心得(一) 简单语法 我的MYSQL学习心得(二) 数据类型宽度 我的MYSQL学习心得(三) 查看字段长度 我的MYSQL学习心得(四) 数据 ...

  5. JavaScript 秘密花园 学习心得

    目的 记录一下学习心得,便于以后复习,内容是比较基础的...但是很多内容我还是不知道... 对象 对象使用和属性 1.JavaScript 中所有变量都可以当作对象使用,除了两个例外 null和dun ...

  6. effective java 学习心得

    目的 记录一下最主要学习心得,不然凭我这种辣鸡记忆力分分钟就忘记白看了... 用静态工厂方法代替构造器的最主要好处 1.不必每次都创建新的对象 Boolean.valueOf Long.valueOf ...

  7. python学习心得第四章

     python 学习心得第四章 1.lambda表达式 1:什么是lambda表达式 为了简化简单函数的代码,选择使用lambda表达式 上面两个函数的表达式虽然不一样,但是本质是一样的,并且lamb ...

  8. python学习心得第三章

    python学习心得第三章 1.三元运算 变量=值1 if 条件 else 值2 由图如果条件成立则赋值1给变量,如果条件不成立则赋值2给变量. 2.数据类型 集合:set() class set(o ...

  9. windows类书的学习心得(转载)

    原文网址:http://www.blogjava.net/sound/archive/2008/08/21/40499.html 现在的计算机图书发展的可真快,很久没去书店,昨日去了一下,真是感叹万千 ...

随机推荐

  1. 笔记03 wpf 在MVVM模式下怎样在Viewmodel里面获得view的控件对象

     转自http://blog.csdn.net/qing2005/article/details/6601199http://blog.csdn.net/qing2005/article/detail ...

  2. 运维基础-IO 管道

    什么是文件描述符FD或者文件句柄? 通过构建一个带有编号标记的通道(文件描述符)的进程结构来管理打开的文件.今晨连接到文件,从而达到这些文件所代表的的数据内容或者设备.通过使用通道0.1.2(称为标准 ...

  3. freescale-sdk linux移植一搭建编译环境脚本host-prepare.sh分析

    接下来使用自己的课外歇息时间,对基于PowerPC架构freescale-sdk,进行linux移植和分析.主要參考官方文档freescale linux sdk START_HERE.html,首先 ...

  4. caffe2 安装与介绍

    http://blog.csdn.net/yan_joy/article/details/70241319 标签: 深度学习 2017-04-19 15:31 5970人阅读 评论(0) 收藏 举报 ...

  5. 解压 boot.img

    ./split_bootimg.pl boot.img Page size: 2048 (0x00000800) Kernel size: 7062084 (0x006bc244) Ramdisk s ...

  6. 流迭代器 + 算法灵活控制IO流

    前言 标准算法配合迭代器使用太美妙了,使我们对容器(数据)的处理更加得心应手.那么,能不能对IO流也使用标准算法呢?有人认为不能,他们说因为IO流不是容器,没有迭代器,故无法使用标准算法.他们错了,错 ...

  7. Android 一键清理动画

    版本号:1.0  日期:2014.7.29 2014.7.30 版权:© 2014 kince 转载注明出处   一键清理是非常多Launcher都会带有的功能,其效果也比較美观.实现方式或许有非常多 ...

  8. 在Mac OS中配置CMake的详细图文教程http://blog.csdn.net/baimafujinji/article/details/78588488

    CMake是一个比make更高级的跨平台的安装.编译.配置工具,可以用简单的语句来描述所有平台的安装(编译过程).并根据不同平台.不同的编译器,生成相应的Makefile或者project文件.本文主 ...

  9. NOTE:rfc5766-turn-server

    NOTE:This project is active in Google code: http://code.google.com/p/rfc5766-turn-server/ 启动方法:./tur ...

  10. IOS 文件夹结构

    版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/MyGameZone/article/details/24494765 IOS文件夹结构 说明 这些仅 ...