我遇到了这个编译得很好的奇怪代码片段:
class Car
{
public:
int speed;
};
int main()
{
int Car::*pSpeed = &Car::speed;
return 0;
}
为什么 C++ 有这个指向类的非静态数据成员的指针?这个奇怪的指针在实际代码中有 什么 用?
原文由 Ashwin Nanjappa 发布,翻译遵循 CC BY-SA 4.0 许可协议
我遇到了这个编译得很好的奇怪代码片段:
class Car
{
public:
int speed;
};
int main()
{
int Car::*pSpeed = &Car::speed;
return 0;
}
为什么 C++ 有这个指向类的非静态数据成员的指针?这个奇怪的指针在实际代码中有 什么 用?
原文由 Ashwin Nanjappa 发布,翻译遵循 CC BY-SA 4.0 许可协议
我喜欢 *
和 &
运算符:
struct X
{
int a {0};
int *ptr {NULL};
int &fa() { return a; }
int *&fptr() { return ptr; }
};
int main(void)
{
X x;
int X::*p1 = &X::a; // pointer-to-member 'int X::a'. Type of p1 = 'int X::*'
x.*p1 = 10;
int *X::*p2 = &X::ptr; // pointer-to-member-pointer 'int *X::ptr'. Type of p2 = 'int *X::*'
x.*p2 = nullptr;
X *xx;
xx->*p2 = nullptr;
int& (X::*p3)() = X::fa; // pointer-to-member-function 'X::fa'. Type of p3 = 'int &(X::*)()'
(x.*p3)() = 20;
(xx->*p3)() = 30;
int *&(X::*p4)() = X::fptr; // pointer-to-member-function 'X::fptr'. Type of p4 = 'int *&(X::*)()'
(x.*p4)() = nullptr;
(xx->*p4)() = nullptr;
}
事实上,只要成员是公开的或静态的,一切都是真的
原文由 mada 发布,翻译遵循 CC BY-SA 4.0 许可协议
3 回答2k 阅读✓ 已解决
2 回答3.9k 阅读✓ 已解决
2 回答3.2k 阅读✓ 已解决
1 回答3.2k 阅读✓ 已解决
1 回答2.7k 阅读✓ 已解决
3 回答3.4k 阅读
1 回答1.6k 阅读✓ 已解决
它是一个“指向成员的指针”——下面的代码说明了它的用法:
至于您 为什么 要这样做,它为您提供了另一个层次的间接性,可以解决一些棘手的问题。但老实说,我从来没有在自己的代码中使用过它们。
编辑: 我想不出一个令人信服的使用指向成员数据的指针。指向成员函数的指针可用于可插拔架构中,但再次在狭小的空间中生成示例让我失望。以下是我最好的(未经测试的)尝试 - 在将用户选择的成员函数应用于对象之前会执行一些前后处理的 Apply 函数:
c->*func
周围的括号是必要的,因为->*
运算符的优先级低于函数调用运算符。