C++ 函数的重载指针
我正在查看以下代码:C++ 函数的重载指针,c++,C++,我正在查看以下代码: string toUpper(string s) { string result; int (*toupperp)(int) = &toupper; // toupper is overloaded transform(begin(s), end(s), back_inserter(result), toupperp); return result; } 我被这句话弄糊涂了: int (*toupperp)(int) = &
string toUpper(string s) {
string result;
int (*toupperp)(int) = &toupper; // toupper is overloaded
transform(begin(s), end(s), back_inserter(result), toupperp);
return result;
}
我被这句话弄糊涂了:
int (*toupperp)(int) = &toupper; // toupper is overloaded
1.为什么需要这条线
2.我相信&
会从内存中检索指向某个对象的指针。但是toupper
,函数名已经是指针了,不是吗?为什么我们不能这样做:
int (*toupperp)(int) = toupper;
3.如果函数用于字符串
,为什么函数会重载到int
?1)实际上没有必要。如果您使用了using namespace std
指令,则有必要强制转换为所需的类型。所以,你也可以说
transform(begin(s), end(s), back_inserter(result), static_cast<int(*)(int)>(&toupper));
2) 是的,作为函数名的标识符会衰减为指针,但它们并不完全相同。话虽如此,在这种情况下,可以这样说
int (*toupperp)(int) = toupper;
甚至(如果您没有使用使用namespace std
指令):
3) 这是为了与C标准库兼容。它用于s
的每个元素,对于string
而言,它是一个char
您要传递的是指向函数toupper
(请参阅)的指针。将此指针存储到局部变量toupperp
中。toupperp
的类型是指向函数的指针,该函数将int
作为参数,并返回int
除非toupper
以奇怪的方式定义,否则transform
似乎使用该函数将每个输入字符更改为大写。每个字符都作为一个整数处理(如果需要,可以使用隐式转换)
关于问题2,使用运算符&
可以更明确地表示您正在获取函数的地址,但实际上您可以省略它。看(我今天学到了一些东西)
如果
toupper
被重载,则使用中间变量是获得所需重载的安全方法。如果所需的重载消失,此方法将在编译时捕获问题。看见(这是我今天学到的其他东西)。3。它不用于字符串
,而是用于字符串
的每个字符
。我认为它没有过载,是吗?@Antonio很好地说明了这一点<代码>::toupper没有重载,但是std::toupper
是-查找中还有一个关于为什么使用中间变量更可取的问题,我学到了一些东西today@Antonio该注释不适用于静态\u cast
。两者都是相同的转换,如果没有这种重载,则都是编译时错误。
int (*toupperp)(int) = toupper;
auto toupperp = toupper;