0x00 前言
文章中的文字可能存在语法错误以及标点错误,请谅解;
如果在文章中发现代码错误或其它问题请告知,感谢!
本文档为个人边学习边记录的C++笔记,非教程,笔记中会存在引用他人文章内容的部分,被引用的原文不会被特殊标记出来,但会在参考文档中给出原文链接。
0x01 指向类的非静态成员指针
类的成员自身也是一些变量、函数或者对象等,因此可以直接将它们的地址存放到一个指针变量中,这样,就可以通过指针直接指向对象的成员,进而可以通过这些指针访问该对象的成员。
指向对象的指针使用前要先声明,再赋值,然后引用。
声明指针语句的一般形式:
类型说明符 类名::*指针名; //声明指向数据成员的指针
类型说明符 (类名::*指针名)(参数表) //声明指向函数成员的指针
赋值指针的一般形式为:
指针名=&类名::数据成员名; //数据成员指针赋值
指针名=&类名::函数成员名; //函数成员指针赋值
访问类对象成员一般形式:
/*访问对象数据成员*/
对象名.*类成员指针名;
或
对象指针名->*类成员指针名
/*访问对象函数成员*/
(对象名.*类成员指针名)(参数表)
或
(对象指针名->*类成员指针名)(参数表)
注意:
·对类成员取地址时,要遵守访问权限的约定,即在一个类的作用域之外不能够对它的私有成员取地址。
·类的定义只确定了各个数据成员的类型、所占内存大小以及它们的相对位置,在定义时并不为数据成员分配具体地址。由于类是通过对象而实例化,在声明类的对象时才会为具体的对象分配内存空间,这时只要将对象在内存中的起始地址与成员指针中存放的相对偏移结合起来就可以访问到对象的数据成员了。
·常成员函数与普通成员函数具有不同的类型,因此能够被常成员函数赋值的指针,需要在声明时明确写出const关键字。
例:
#include <iostream>
using namespace std;
class Point{
public:
Point(int x = 0, int y = 0):x(x), y(y){}
int getX() const {return x;}
int getY() const {return y;}
private:
int x, y;
};
int main() {
Point a(4, 5);
Point *p1 = &a;
int (Point::*funcPtr)() const = &Point::getX;
cout << (a.*funcPtr)() << endl;
cout << (p1->*funcPtr)() << endl;
cout << a.getX() << endl;
cout << p1->getX() << endl;
return 0;
}
运行结果:
4
4
4
4
《C++语言程序设计(第4版)》书上所有章节出现的示例源代码随着学习的深入会陆续上传至github,代码为个人手动输入并通过编译,有的示例代码可能没有注释:https://github.com/fyw4/C-plus-plus-learning-example
以上。
参考文档:
郑莉 董渊 何江舟.《C++语言程序设计(第4版)》[M].北京:清华大学出版社。