• 重载和const形参的学习心得


    在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 0;
    }

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

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

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

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

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

    错误信息如下

    error: redefinition of ‘int calc(int, int)’
    int calc(const int, const int){};
  • 相关阅读:
    ORACLE表空间操作(转)
    ORA12514错误解决方法
    ETL工具 kettle问题
    改变oracle端口号
    查询SQL Server中所有数据库的数据文件位置
    使用URTracker构建企业IT服务平台
    那些年,我做共享软件(2)
    那些年,我做共享软件(1)
    那些年,我做共享软件(3)完结
    浅析缺陷管理系统URTracker
  • 原文地址:https://www.cnblogs.com/huipengly/p/9052619.html
Copyright © 2020-2023  润新知