zoukankan      html  css  js  c++  java
  • 重载和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){};
  • 相关阅读:
    28完全背包+扩展欧几里得(包子凑数)
    HDU 3527 SPY
    POJ 3615 Cow Hurdles
    POJ 3620 Avoid The Lakes
    POJ 3036 Honeycomb Walk
    HDU 2352 Verdis Quo
    HDU 2368 Alfredo's Pizza Restaurant
    HDU 2700 Parity
    HDU 3763 CDs
    POJ 3279 Fliptile
  • 原文地址:https://www.cnblogs.com/huipengly/p/9052619.html
Copyright © 2011-2022 走看看