使用const参数重载函数

时间:2012-10-02 18:31:40

标签: c++ const overloading

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

但是如果一个函数有一个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 ++中允许使用第二个?

2 个答案:

答案 0 :(得分:10)

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

void f(int); // forward declare

void g(){ f(42); }

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

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

答案 1 :(得分:1)

首先,解释为什么不允许第一个代码而第二个代码没问题。

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

说到第二个例子,引用和指针有所不同。因为您无法通过int初始化const int*,也无法使用int *初始化const int。因此,如果您定义两个具有相同返回类型的函数,一个是“const version”指针 reference 参数,另一个不是,这会产生影响。另一个问题出现了,如果我传递int& 对象(或称为变量,相同含义)或int指针,然后匹配哪一个(当参数指针或参考)?答案是“非常规”的。如果你想将“const版本”与非const对象或非指向const指针匹配,你可能需要int *我想弄清楚。

回到你的问题:

  

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

是的,它在某种程度上仅适用于参考和指针。

并且

  

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

分不清楚。我没有多少经验。

有关详细信息,请阅读 C ++ Primer 5th 的相关部分部分。 屏幕截图链接如下:

  1. https://imgur.com/tnqrxVY
  2. https://imgur.com/hF1MjUH
  3. https://imgur.com/Fg2zeEw
  4. 顺便说一下,虽然我是新手。但是第一个答案的const_cast是什么?我不明白“它是一个实现细节”究竟是什么意思。没有冒犯,只是无法理解那部分答案。 :d