C++学习笔记之类成员指针

 更新时间:2022年04月21日 09:35:14   作者:Ofnoname  
类成员指针时指可以指向类的非静态成员的指针,下面这篇文章主要给大家介绍了关于C++类成员指针的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下

C++的类成员指针是一种奇葩的指针。

假设现在我们要表示一个三维的点,现在有两种定义方式:

struct point1{
	int x, y, z;
};

struct point2{
	int c[3];
};

第一种的优点是更直观,但第二种可以方便的用for遍历三个属性。最终我选择了第一种,但是我还想弄一个遍历功能怎么办?这个时候类成员指针就排上用场了,我们可以创建一个“指向point中具体成员的指针”。

int A:: *member = &A::x;

让member指针指向A中的成员x,且类型是int,此时我们就可以通过member来访问x:

point1 tmp{4, 5, 6};
cout << tmp.(*member); //把member解引用,得到tmp::x,表示要访问x

所以我们定义一个数组,就可以迭代访问类里的各种int属性了

int A:: *member [] = {&A::x, &A::y, &A::z};
for (int i = 0; i < 3; ++i)
	cout << tmp.(*member[i]);

这个用途也可以放到成员函数上,构建一个函数列表,顺序调用。

这么个指针的行为跟一般的指针显然不一样,它不保存地址,而是保存一个“偏移量”,从对象地址开头到对象成员的偏移量。这玩意其实可以输出:

struct A{
	int a, b, c;
};

main() {
	printf("%d%d%d", &A::a, &A::b, &A::c); //! 输入为0, 4, 8
	//! 当然这玩意类型不是int,printf直接将他以int解析输出了,所以cout达不到效果
}

这样类成员指针的意义就很明显了,假设一个A的对象t,那么t的地址&t和a的地址&(t.a)是相等的,而&(t.b)要多出来4,&(t.c)又要多出来4。每个对象的内存构造都是一样的,这个类成员指针就是获取每个成员相对于头地址的偏移量,这样当我使用t.*member编译器就知道是头地址+4处的变量,并且是个int。

不过成员函数又不太一样了。不同对象的成员函数只有同一份程序短代码。C++不能用&(t.fun)的方式获取对象的成员函数的地址,要用取&A::fun得到函数的地址。这个当然是真地址了。

类成员指针可以用于static吗?显然不行,static成员单独存放,与类本身无关,取&A::staticmember得到的就是这个变量的正经地址。那可以用于virtual function吗?答案是可以,但是虚函数的地址无法确定,所以又变成了储存偏移量,实际上储存的是函数在虚表中的索引值。

补充:mem_fn

通过mem_fn对类函数成员指针进行包装,来返回一个可调用对象。使用时,包含头文件functional。

#include <iostream>
#include <functional>
using namespace std;
class Compute
{
public:
    Compute(int a, int b) :a(a), b(b)
    {
 
    }
    int add()
    {
        return a + b;
    }
    int sub() const
    {
        return a - b;
    }
private:
    int a;
    int b;
};
int main(void)
{
    Compute com(100, 10), *p = &com;
    auto fun1 = mem_fn(&Compute::add);
    cout << fun1(com) << endl;
    cout << fun1(p) << endl;
    auto fun2 = mem_fn(&Compute::sub);
    cout << fun2(com) << endl;
    cout << fun2(p) << endl;
    cin.get();
    return 0;
}

运行

总结

到此这篇关于C++学习笔记之类成员指针的文章就介绍到这了,更多相关C++类成员指针内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • C++ 容器 Vector 的使用方法

    C++ 容器 Vector 的使用方法

    这篇文章主要介绍了C++ 容器 Vector 的使用方法,Vector 是一个能够存放任意类型的动态数组,有点类似数组,是一个连续地址空间,下文更多详细内容的介绍,需要的小伙伴可以参考一下
    2022-06-06
  • 详解C语言-二级指针三种内存模型

    详解C语言-二级指针三种内存模型

    这篇文章主要介绍了详解C语言-二级指针三种内存模型的相关知识,文中代码非常详细,供大家参考和学习,感兴趣的朋友可以了解下
    2020-06-06
  • C语言实现餐饮点餐管理系统

    C语言实现餐饮点餐管理系统

    这篇文章主要为大家详细介绍了C语言实现餐饮点餐管理系统,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-01-01
  • c++ 预处理之正整型实现方法

    c++ 预处理之正整型实现方法

    这篇文章主要介绍了c++ 预处理之正整型实现方法,需要的朋友可以参考下
    2017-07-07
  • 聊一聊OpenCV相机标定

    聊一聊OpenCV相机标定

    这篇文章主要为大家详细介绍了OpenCV相机标定的相关资料,即获得相机参数的过程,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-01-01
  • 详解进程同步与互斥机制

    详解进程同步与互斥机制

    进程同步是一个操作系统级别的概念,是在多道程序的环境下,存在着不同的制约关系,为了协调这种互相制约的关系,实现资源共享和进程协作,从而避免进程之间的冲突,引入了进程同步
    2021-06-06
  • C语言带你学会位段相关知识

    C语言带你学会位段相关知识

    这篇文章主要介绍了什么是位段,位段的声明和结构是类似的,位段的成员必须是 int、unsigned int 或signed int;位段的成员名后边有一个冒号和一个数字,本文有详细的代码案例,感兴趣的同学可以参考阅读
    2023-04-04
  • C++简易版Tensor实现方法详解

    C++简易版Tensor实现方法详解

    这篇文章主要介绍了C++简易版Tensor的实现方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值
    2022-08-08
  • OnSize、OnSizing和OnGetMinMaxInfo区别分析

    OnSize、OnSizing和OnGetMinMaxInfo区别分析

    这篇文章主要介绍了OnSize、OnSizing和OnGetMinMaxInfo区别分析,需要的朋友可以参考下
    2015-01-01
  • C++STL之string类的使用

    C++STL之string类的使用

    这篇文章主要为大家详细介绍了C++STL中的string类,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2022-03-03

最新评论