14

函数重载可能发生在具有相同数量参数的两个成员函数之间,如果其中一个被声明为 const。

但是,如果一个函数有一个 const 参数,而另一个函数有相同类型的非常量参数呢?它适用于引用和指针吗?如果 C++ 提供它,为什么它提供?如果您知道,请与我分享原因。

下面是帮助您理解上述场景的示例。

void fun(const int i)
{
    cout << "fun(const int) called ";
}
void fun(int i)
{
    cout << "fun(int ) called " ;
}
int main()
{
    const int i = 10;
    fun(i);
    return 0;
}

输出:编译器错误:redefinition of 'void fun(int)'

void fun(char *a)
{
  cout<<"non-const fun() called";
}

void fun(const char *a)
{
  cout<<"const fun() called";
}

int main()
{
  const char *ptr = "GeeksforGeeks";
  fun(ptr);
  return 0;
}

输出:调用了 const fun()

为什么在 C++ 中允许第二个?

4

2 回答 2

14

第一个参数是顶级的 const。这意味着函数不能更改参数的值,但是,调用者并不关心:被调用者获取参数的副本,因此如果参数具有顶级 const,它是一个实现细节。请注意,以下工作:

void f(int); // forward declare

void g(){ f(42); }

void f(int const i){ /*...*/ } // define above declared function

对于第二组重载,const不再是顶级的。它描述了被调用者是否可以更改指针指向的内容。作为呼叫者,您确实关心这一点。它不再只是一个实现细节。

于 2012-10-02T18:36:14.753 回答
4

首先,解释为什么第一个代码不允许,而第二个代码可以。

const int并且int作为参数,您传递任何相关类型,doubleint其他任何可以转换为 int 的类型,都const int可以int接受传入值,实际上没有区别。如果编译器允许定义两者,那么调用哪一个?你不知道,编译器也不知道。所以第一部分代码是不允许的。

当谈到第二个示例时,引用和指针会有所不同。因为您不能传递 aconst int*来初始化int *,也不能使用const int来初始化int&。因此,如果您定义两个具有相同返回类型的函数,一个是“const 版本”指针引用参数,另一个不是,这会有所不同。另一个问题出现了,如果我传递一个int 对象(或称为变量,相同含义)或int *指针,那么匹配哪个(当参数是指针引用时)?答案是“非常量”。如果您想将“const 版本”与非 const 对象或非指向 const 指针相匹配,您可能需要const_cast我想弄清楚。

所以回到你的问题:

但是,如果一个函数有一个 const 参数,而另一个函数有相同类型的非常量参数呢?它适用于引用和指针吗?

是的,它在某种程度上只适用于引用和指针。

如果 C++ 提供它,为什么它提供?

说不出来。我没有太多经验。

有关更多信息,请阅读C++ Primer 5th非常相关的部分。截图链接如下:

  1. https://imgur.com/tnqrxVY
  2. https://imgur.com/hF1MjUH
  3. https://imgur.com/Fg2zeEw

顺便说一句,虽然我是新手。但是int const i第一个答案是什么?而且我不明白“这是一个实现细节”的确切含义。无意冒犯,只是无法理解答案的那一部分。:D

于 2018-04-12T15:26:57.723 回答