当前位置:网站首页 > 技术博客 > 正文

指向成员函数的指针不能在类定义之外定义



声明指针或指向成员指针类型的变量。

指针的声明是简单声明,其声明符拥有下列形式

无指向引用的指针,无指向位域的指针。 当没有详述地提及“指针”时,通常不包含指向(非静态)成员的指针。

指针类型的值是下列之一:

  • 指向对象或函数的指针(该情况下说该指针指向函数或对象),或
  • 对象末尾后指针,或
  • 该类型的空指针值,或
  • 无效指针值

指向对象的指针表示其地址,为内存中对象所占用的首字节的地址。对象的末尾后指针亦表示地址,为内存中对象所占用的存储之后的首个字节的地址。

注意,两个表示同一地址的指针可能拥有不同的值。

对象指针,能以应用于任何对象类型(包含另一指针类型)的表达式的取址运算符的返回值初始化:

指针可作为内建间接寻址运算符(一元 )的操作数,返回指代被指向对象的左值表达式:

指向类对象的指针亦可作为成员访问运算符 operator-> 和 operator->* 的左侧操作数。

由于数组到指针隐式转换的原因,可以以数组类型的表达式初始化指向数组首元素的指针:

由于指针的派生类到基类隐式转换的原因,可以以派生类的地址初始化指向基类的指针:

若 是多态的,则这种指针可用于进行虚函数调用。

某些加法、减法、自增和自减运算符对于指向数组元素的指针有定义:这种指针满足遗留随机访问迭代器 (LegacyRandomAccessIterator) 要求,并允许 C++ 库算法工作于原始数组上。

某些情况下,比较运算符对指针有定义:两个表示相同地址的指针比较相等,两个空指针值比较相等,指向同一数组中的元素的指针的比较与各元素的数组下标的比较方式相同,而指向拥有相同成员访问的非静态数据成员的指针以各成员的声明顺序进行比较。

多数实现亦为随机来源的指针提供,例如将它们实现为连续虚拟地址空间中的地址。未能做到的实现(例如,其中并非指针的所有位都是内存地址的一部分因而在比较时必须忽略之,或者要求附带的计算,或者指针与整数并非一对一关系),为指针提供了具有此项保证的 特化。这使得可在关联容器(如 或 )中使用所有随机来源的指针。

指向任意类型对象的指针,可隐式转换成指向 的指针(可选地有 cv 限定);不改变其值。逆向的转换要求 static_cast 或显式转型,生成其原指针值:

若原指针指向某多态类型对象中的基类子对象,则可用 dynamic_cast 获得指向最终派生类型的完整对象的 。

void 指针用于传递未知类型对象,这在 C 接口中常见: 返回 , 期待接受两个 参数的用户提供回调。 期待接受并返回 的用户提供的回调。所有情况下,调用方负责在使用前将指针转型到正确类型。

函数指针能以非成员函数或静态成员函数的地址初始化。由于函数到指针隐式转换的原因,取址运算符是可选的:

不同于函数或函数的引用,函数指针是对象,从而能存储于数组、被复制、被赋值等。

函数指针可用作函数调用运算符的左侧操作数,这会调用被指向的函数:

解引用函数指针生成标识被指向函数的左值:

若只有一个重载匹配指针类型的话,函数指针可以从可包含函数、函数模板特化及函数模板的一个重载集进行初始化(细节见重载函数的地址):

相等比较运算符对于函数指针有定义(若指向同一函数则它们比较相等)。

指向作为类 的成员的非静态数据成员 的指针,能准确地以表达式 初始化。在 C 的成员函数中,如 或 这样的表达式不构成指向成员指针。

这种指针能用作成员指针访问运算符 与 的右侧操作数:

指向可访问无歧义非虚基类的数据成员的指针,可以隐式转换成指向派生类的同一数据成员的指针:

相反方向的转换,即从指向派生类的数据成员的指针到指向无歧义非虚基类的数据成员的指针,允许由 static_cast 和显式转型来进行,即使基类并无该成员(但当用该指针访问时,最终派生类中有)亦可:

成员指针的被指向类型也可以是成员指针自身:成员指针可为多级,而且在每级可以有不同的 cv 限定。亦允许指针和成员指针的混合多级组合:

指向作为类 的成员的非静态成员函数 的指针,可准确地以表达式 初始化。在 C 的成员函数内,如 或 这样的表达式不构成成员函数指针。

这种指针可以用作成员指针访问运算符 与 的右操作数。结果表达式只能用作函数调用运算符的左侧操作数:

相反方向的转换,即从指向派生类的成员函数的指针到指向无歧义非虚基类的成员函数的指针,允许由 static_cast 与显式转型来进行,即使基类无该成员函数(但在用该指针进行访问时,最终派生类有):

成员函数指针可用作回调或函数对象,通常在应用 或 之后:

每个类型的指针都拥有一个特殊值,称为该类型的空指针值(null pointer value)。值为空的指针不指向对象或函数(解引用空指针是未定义行为),并与所有亦为值的同类型指针比较相等。

为将指针初始化为空或赋空值给既存指针,可以使用空指针字面量 、空指针常量 或从整数值 的隐式转换。

零初始化和值初始化亦将指针初始化为其空值。

空指针可用于指示对象不存在(例如 function::target()),或作为其他错误条件的指示器(例如 dynamic_cast)。通常,接受指针实参的函数始终需要检查值是否为空,并以不同方式处理该情况(例如,delete 表达式在传递空指针时不做任何事)。

  • 若指针声明中 在 之前出现,则它是 的一部分,并应用到被指向的对象。
  • 若指针声明中 在 之后出现,则它是 的一部分,并应用到所声明的指针。

通常,从一个多级指针到另一个的隐式转换,遵循限定转换和指针比较运算符中所描述的规则。

版权声明


相关文章:

  • 数据库中有哪些索引?2024-12-26 20:01:02
  • linux给用户添加组2024-12-26 20:01:02
  • 字符串数组怎么定义,java2024-12-26 20:01:02
  • 计算机操作系统组成部分有哪些2024-12-26 20:01:02
  • 背包问题动态规划表2024-12-26 20:01:02
  • mlp多层感知机2024-12-26 20:01:02
  • 树状算图与算法流程2024-12-26 20:01:02
  • vue3.0动态路由2024-12-26 20:01:02
  • tinyxml gettext2024-12-26 20:01:02
  • redisson集群模式2024-12-26 20:01:02