助记符和指向成员语法的指针
Mnemonics and the pointer-to-member syntax
指向-(数据(成员的指针在这里进行了说明(根据这个答案:https://stackoverflow.com/a/670744/4416169(
#include <iostream>
using namespace std;
class Car
{
public:
void carFunc(){}//added this myself
int speed;
};
int main()
{
int Car::*pSpeed = &Car::speed;
Car c1;
c1.speed = 1; // direct access
cout << "speed is " << c1.speed << endl;
c1.*pSpeed = 2; // access via pointer to member
cout << "speed is " << c1.speed << endl;
return 0;
}
为了记住这些指向数据成员的指针的行为,将它们视为存储指向指向数据成员中的内存偏移量,这是否有用,并且至少部分准确?然后,这个内存偏移量将被添加到特定类实例的内存位置,该类实例用于访问指向该特定实例中数据成员的指针。
若这个助记符有缺陷,那个么对于指向数据成员的指针还有什么更好的助记符呢?
然后是指向成员函数的指针的情况:
void (Car::*fptr)() = &Car::carFunc;
将这些指向成员函数的指针想象成简单干净的函数指针,指向指定的成员函数,除此之外,还隐式地从调用它们的实例中获取this
指针,这是否正确?
为了记忆这些指向数据成员的指针的行为,将它们视为存储指向指向指向数据成员中的内存偏移量是否有用,并且至少部分准确?
当然。
将这些指向成员函数的指针想象成简单干净的函数指针是否正确
就它们的使用方式而言,指向成员函数的指针确实与使用的函数指针非常相似,只是语法不同。然而;助记符";在考虑虚拟功能时失败。仅仅指向函数的指针是不足以使其工作的。
我想说,虽然它可能是一个诱人的助记符,但我会警告不要使用它。
指向成员的指针与常规指针大不相同,尽早在他们的脑海中设定这种区别会让人受益。以后可能会省去很多悲伤。例如,
PtrType1 p = getPtrType1P();
PtrType2 z = reinterpret_cast<PtrType2>(p);
PtrType1 k = reinterpret_cast<PtrType1>(z);
只要PtrType1和PtrType2是规则指针,就会产生完全可用的k
。但是,如果其中一个是成员指针,则这将不再是有效的代码。请记住,指向虚拟函数成员的指针通常为16字节长(是常规指针大小的两倍(。
我认为,更好的助记符是将指向成员的指针理解为它们是什么——这是一种间接访问给定指针的类成员的方法
- 1d 智能指针不适用于语法 (*)++
- 助记符和指向成员语法的指针
- QMetaObject invokeMethod的基于函数指针的语法
- 共享指针和具有自定义删除程序的唯一指针之间的语法差异背后的任何原因
- 使用基类指针调用基类的值构造函数的语法是什么?
- C++语法差异:二维和一维数组(指针算术)
- C++中未命名函数指针的语法
- c++ 获取非语法使用"&"创建指针
- C++语法中的函数指针
- 存储函数指针的正确语法
- 我想获取点的属性,它报告错误 C3867:"point::output_x":非标准语法;使用"&"创建指向成员的指针
- 非标准语法,使用 & 创建指向成员的指针
- 将引用绑定到指针的语法是什么?(各种)
- 如何使用二维语法访问指针
- 带有自定义类的共享指针语法背后的任何原因,如下所示
- 非标准语法使用 '&' 创建指向成员 C++ 的指针
- 如何在不更改现有函数语法的情况下将普通指针替换为共享指针
- C++指向函数声明语法的指针
- 难以理解指针语法C++
- 数组的语法指针C++