在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++编译代码,看看编译器会有什么提示。

int calc(int, int);
int calc(const int, const int); int main()
{
return ;
}

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

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

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

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

int calc(int, int){};
int calc(const int, const int){}; int main()
{
return ;
} 

错误信息如下

error: redefinition of ‘int calc(int, int)’
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. Android - Activity定制横屏(landscape)显示

    Activity定制横屏(landscape)显示 本文地址: http://blog.csdn.net/caroline_wendy Android横屏(landscape)显示:  android ...

  2. 使用 Kingfisher 处理网络图片的读取与缓存

    Kingfisher 是一个读取网络图片和处理本地缓存的开源库,由 onevcat 开发.提到图片缓存库,那么熟悉 Objective-C 开发的同学,可能会想起 SDWebImage. 没错,Kin ...

  3. js event 的target 和currentTarget

    target  点击的实际tag currentTarget 绑定事件的target

  4. SharePoint ULS Log Viewer 日志查看器

    SharePoint ULS Log Viewer 日志查看器 项目描写叙述 这是一个Windows应用程序,更加轻松方便查看SharePoint ULS日志文件.支持筛选和简单的视图. 信息 这是一 ...

  5. 解压 boot.img

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

  6. CF 445A(DZY Loves Chessboard-BW填充)

    A. DZY Loves Chessboard time limit per test 1 second memory limit per test 256 megabytes input stand ...

  7. 在Windows平台用visual studio编译的可执行文件部署时报:应用程序无法正常启动0xc000007b(跟DirectX9无关的原因)

    最近在做EasyDarwin开源流媒体服务器Windows版本编译与部署时发现一个问题,在开发机本机运行都很正常,但是部署到目标机器(未安装vs等开发环境)时,莫名其妙报出了"应用程序无法正 ...

  8. linux jdk更换

    有时候会发现,安装了新的jdk,而java -version 之后发现仍旧是旧的jdk,即使自己已经更新了JAVA_HOME的环境变量,解决方法如下: 具体如下: 1. 查看相应的jdk是否在 ubu ...

  9. iOS 打开应用与系统功能的调用

    [[UIApplication sharedApplication] openURL:url]; 通过给url不同的值,可以实现调用系统自带 电话/短信/邮箱/浏览器/...   1.调用 电话pho ...

  10. React + webpack 环境配置

    安装配置Babel babel-preset-es2015 ES6语法包,使代码可以随意地使用ES6的新特性. babel-preset-react React语法包,专门用于React的优化,在代码 ...