Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/actionscript-3/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 函数的重载指针_C++ - Fatal编程技术网

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;