C++笔记之关于函数名前的取址符

时间: 2023-12-16 admin 维修知识

C++笔记之关于函数名前的取址符

C++笔记之关于函数名前的取址符

C++笔记之关于函数名前的取址符

相关博文:C++之指针探究(十一):函数名的本质和函数指针

code review!

文章目录

  • C++笔记之关于函数名前的取址符
    • 一.函数名可以被视为指向函数的地址
    • 二.`sayHello`和`&sayHello`是不是等同?
    • 三.Qt信号与槽中的`取地址符&`

一.函数名可以被视为指向函数的地址

在C++中,函数名通常被解释为指向函数的地址。函数名可以被视为函数的指针,它指向函数的起始位置,因此可以用于函数指针和函数指针数组的操作。这种行为允许你动态地选择要调用的函数或在运行时根据条件调用不同的函数。

下面是一个简单的示例,演示了函数名可以被视为指向函数的地址:

代码

#include <iostream>void sayHello() {std::cout << "Hello, world!" << std::endl;
}int main() {// 声明一个指向函数的指针void (*functionPointer)() = sayHello;// 使用函数指针调用函数functionPointer();return 0;
}

在这个示例中,functionPointer 是一个指向 sayHello 函数的指针,我们可以使用它来调用 sayHello 函数。这是因为函数名 sayHello 在这里被视为指向函数的地址。

需要注意的是,函数名不是普通变量,因此有一些限制和特殊情况,如函数重载、成员函数指针等,需要特殊的语法来处理。但总的来说,函数名在C++中可以被视为指向函数的地址。

二.sayHello&sayHello是不是等同?

在大多数情况下,sayHello&sayHello 在C++中是等效的,因为函数名在大多数情况下会隐式地转换为指向函数的指针。因此,在你的示例中,sayHello&sayHello 可以互换使用。

下面是一个示例,演示了这两种方式的等效性:

代码

#include <iostream>void sayHello() {std::cout << "Hello, world!" << std::endl;
}int main() {// 使用函数名调用函数sayHello();// 使用函数指针调用函数void (*functionPointer)() = sayHello;functionPointer();// 使用 & 操作符获取函数的地址并调用函数void (*functionPointer2)() = &sayHello;functionPointer2();return 0;
}

在上述示例中,sayHello&sayHello 都用于获取函数的地址,并且它们都可以用作函数指针的初始化。然后,你可以使用这些指针来调用函数,它们都会成功调用 sayHello 函数。

需要注意的是,C++通常会自动将函数名转换为指向函数的指针,因此 sayHello&sayHello 之间的区别在大多数情况下是不明显的。但是,从概念上讲,&sayHello 是获取函数地址的显式方式,而 sayHello 是隐式方式,两者在语义上是等效的。

三.Qt信号与槽中的取地址符&

既然函数名可以被视为地址,那么
connect(sender, &QObject::destroyed,this,&MyObject::objectDestroyed);
是不是可以写成:
connect(sender, QObject::destroyed, this, MyObject::objectDestroyed);