函数指针是指向函数的指针,该函数可以存储在变量中。它允许运行时选择运行哪个函数。
我在这行 std::cout 中遇到问题 << &X::a << std::endl; this line print 1 supposed to printed address of &X::a this my code #include #包括 我在这一行遇到问题 std::cout << &X::a << std::endl;这一行 print 1 应该打印 &X::a 的地址 这是我的代码 #include <iostream> #include <string> #include <iomanip> class X { public: int a; void f(int b); }; void X::f(int b) { std::cout << "the value of b is " << b << std::endl; } void add() { std::cout << "Hello this function hello" << std::endl; } int main() { void (*funcPtr)(void) = add; funcPtr(); int X::*ptrnumber = &X::a; void (X::*ptrfunction)(int) = &X::f; X xobj; xobj.*ptrnumber = 10; std::cout << "the vslue of a is " << xobj.*ptrnumber << std::endl; (xobj.*ptrfunction)(20); std::cout << std::hex << &X::a << std::endl; //std::cout << funcPtr << std::endl; } 我用不同的编译器c++编译,但我有相同的输出 我显示了这个“M1Xi”的类型,我不知道这个数据类型 &X::f 和 &X::a 不是 指针。因为 f 和 a 都是 非静态 成员,所以它们是 成员指针,无论命名和语法相似性如何,它们的行为都与 指针 非常不同。 成员指针(无论是函数还是数据成员)并不代表地址。所以尝试打印它的地址是没有意义的。 因此,标准库中的 << 和 std::ostream 也没有重载,这也需要成员指针。 但是,存在以 bool 作为参数的重载,并且可以将成员指针隐式转换为 bool。如果成员指针具有空成员指针值,则结果为 false,否则结果为 true。使用默认设置 true 将打印为 1。 表达式 &X::a 不是可以在普通地址中使用的地址。它是成员的相对地址。它只能与指向成员的指针一起使用。 指向成员的指针可以转换为其他指向成员的指针,并且仅在有约束的情况下。它们不能转换为其他类型的指针或 int。在这种情况下很难打印它们的值。 唯一可能的转换是布尔值,它的目的是查看它是否为空。因为指向成员的指针可以为 nullptr: int X::*px = &X::a; bool bx = px; std::cout << bx <<std::endl; px = nullptr; bool bn = px; std::cout << bn <<std::endl; 如果要打印指向成员的指针的地址,则必须使用对象取消引用它: std::cout << std::hex << &(xobj.*(&X::a)) << std::endl; 正如您可能想象的那样,不可能使用取消引用 nullptr 来成员或使用 nullptr 作为对象地址的技巧,因为取消引用空指针是 UB。顺便说一句,这不是一个真正的问题,因为该标准对对象的布局几乎没有保证,因此这个相对地址本身没什么用处。
如何将对象 Problem1 obj 的非静态成员函数 eval 传递给对象 Solversolver ? #包括 #包括 // 非模板类 结构求解器{ ...
在我正在编写的固件中,我创建了一种变量类型。类似于下面的内容: 结构 SitemMenu { 无符号整型 ID; 字符*文本; 无效 * 子菜单 } typedef s...
我有一个程序必须将函数存储为 void (*) (void*)。使用该签名创建函数会导致代码重复(通常第一行是将 void 指针转换为正确的...
何时有必要或有意义地为函数 f 编写 &f 或为函数指针 fp 编写 *fp(除了:sizeof &f)?
来自 C17 标准草案(6.3.2.1 ¶4;脚注已删除): 函数指示符是具有函数类型的表达式。除非它是 sizeof 运算符的操作数,或者一元 &
printf 中的寻址运算符将函数指针的地址从常规地址更改为 0x1000。为什么会发生这种情况,这意味着什么? #包括 主函数() { ...
我有一个可以创建 url 的类,以及一个线程,它向实例询问 url 并使用 curl 运行它们(线程由类的静态成员管理,实例被添加到列表等,省略......
编译时错误:函数模板“cudaOccupancyMaxPotentialBlockSize”的实例与参数列表不匹配
我正在尝试使用在 cuda_runtime.h 中实例化的 API cudaOccupancyMaxPotentialBlockSize,如下所示: 模板 静态 __inline__ __host__ CUDART_DEVICE cudaError_t
C++ 函数调用,通过具有指向函数的公共成员指针的对象,不使用取消引用运算符
好吧,我认为标题已经足够描述了(但令人困惑,抱歉)。 我正在阅读这个图书馆:Timer1。 在头文件中有一个指向函数的公共成员指针,如下所示: 类
使用 std::map::at 时对 std::map 的调用不匹配
我遇到了 std::map 函数的问题。 简而言之,我的代码由一个模板基类组成,在该类中,我有一个如下所示的结构: 模板 类基础 {
在 Unity 中可序列化的 C# 中找到函数指针的正确语法时出现问题
我正在尝试在数据结构中保存一些参数化函数,以便在运行时使用。我希望能够在编辑器中输入参数。 我排除了 UnityEvent,因为我不想指定
我有一个成员函数是这样的: Foo类 { 民众: 模板 static void bar(const Args&... args) { /* 代码 */ } }; 我想把它作为模板传递
我在下面有以下代码,我想让两个线程做同样的事情,除了一个线程调用 tick 方法,一个调用 render 方法,而不是让它在同一个线程上......
假设我有以下代码: 特性 Saluter { fn 你好(&self); 再见(&self); } 结构 A {} 结构 B {} 为 A { 实施 Saluter fn 你好(&自我){ println!("...
检查以下代码: #包括 使用命名空间标准; int& foo() { 静态整数 i = 0; 返回我; } 诠释主要(){ 计算<< &foo() << endl; cout <...
我不确定我是否在以下情况下定义了行为: 我的函数指针类型: typedef void (*DoAfter_cb_type)(void); 应该分配回调的函数: 无效的 DoSomet...
无法从 <brace-enclosed initializer list> 转换为 std::map
我被困在一个问题上,我知道这里已经发布了一些类似的问题,但是我还没有能够根据他们的回答解决问题。有人可以帮我吗...
我有简单的课 模板 使用 ConversionFunction = T(*)(T val); 静态 int Foo1(int x) { 返回 x * x; } 静态双 Foo1(双 x) { 返回 x * x + 1; } 结构...
我正在研究一种 C++ 算法,它可以像线性结构一样对列表进行排序,而无需使用任何外部数据结构的任何帮助。我的计划是先找到最小值,然后把它放在最开始...
我有一个问题,我想将 uint8_t[] 数组作为参数传递给定义为 typedef void (dangerousC)(void) 的函数指针;此外,我正在使用 Windows API 标头。 假设变量 ...