函数重载可能发生在具有相同参数数量的两个成员函数之间,如果其中一个成员函数声明为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 ++中允许使用第二个?
答案 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 int
和int
作为参数,您可以传递任何相关类型,double
,int
或其他任何可以转换为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 的相关部分部分。 屏幕截图链接如下:
const_cast
是什么?我不明白“它是一个实现细节”究竟是什么意思。没有冒犯,只是无法理解那部分答案。 :d