【问题标题】:function overloading with const parameters带 const 参数的函数重载
【发布时间】:2012-10-02 18:31:40
【问题描述】:

函数重载可能发生在具有相同数量参数的两个成员函数之间,如果其中一个被声明为 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++ 中允许使用第二个?

【问题讨论】:

  • 试试void fun(char * const a)
  • 我的回答还缺少什么吗?如果是,请告诉我,以便我改进。 :) 如果没有,我可以建议接受吗?

标签: c++ constants overloading


【解决方案1】:

第一个参数是顶级const。这意味着函数不能改变参数的值,然而,调用者并不关心:被调用者得到参数的 copy,所以如果参数有 top-level const,这是一个实现细节。请注意以下工作:

void f(int); // forward declare

void g(){ f(42); }

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

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

【讨论】:

  • 值得注意的是,与第三个函数的配对是void fun(char * const a)
  • 真的有像int const i这样的东西吗?
  • 这个答案正确吗?我的意思是,即使不调用 main 中的函数,第一个代码也无法工作。
【解决方案2】:

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

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

当谈到第二个例子时,引用和指针会有所不同。因为您不能通过const int* 来初始化int *,也不能使用const int 来初始化int&amp;。所以如果你定义了两个返回类型相同的函数,一个是"const version" pointerreference 参数,另一个不是,这会有所不同。另一个问题来了,如果我传递一个intobject(或称为变量,同义)或int *指针,那么匹配哪个(当参数为pointer参考)?答案是“非常量”。如果您想将“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

【讨论】:

  • 很好的答案!并回答您的问题:int const iconst int i 相同,这只是一个偏好问题。在这种情况下,“这是一个实现细节”意味着它是一个仅在函数的内部代码及其实现中重要的细节;这个细节对于从外部调用它的“用户”来说并不重要。 “用户”可以是同一个开发者,或者在这种情况下 - 编译器本身
猜你喜欢
  • 2011-04-10
  • 1970-01-01
  • 2012-05-02
  • 1970-01-01
  • 1970-01-01
  • 2022-11-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多