C++类成员指针(指向类成员的指针)
1、指向类的数据成员的指针:
声明格式如下:
<类型说明符> <类名>::* <指针变量名>;
2、指向类的成员函数的指针:
声明格式如下:
<类型说明符> (<类名>::*<指针名>)(<参数表>);
如:
class A
{
private:
int a;
public:
int c;
public:
A(int i)
{
a = i;
};
int Fun(int b)
{
return ((a * c) + b);
};
};
定义一个指向类A的数据成员c的指针,其格式如下:
int A::* pc = &(A::c);
定义一个指向类A的成员函数Fun()的指针,其格式如下:
int (A::*pFun)(int) = A::fun; 或 int A::*pFun(int); pFun = A::fun;
由于类不是运行时存在的对象,所以在使用这类指针的时候,要定义类的一个对象,然后通过这个对象来访问这类指针所指向的成员;
如:
A a; a.*pc = ; //为对象a的数据成员c赋值8; A* pa; pa = &a; pa->*pc = ; //通过指向对象的指针来为指向对象成员的指针所指向的数据成员赋值;
其中,运算符".*"和"->*"都是通过指向类成员的指针来操作对象成员的运算符;
3.指向普通函数的指针的定义格式:
<类型说明符> (*<指向函数的指针名>)(<参数表>);
赋值:
<指向函数的指针名> = <函数名>;
调用:
(*<指向函数的指针名>)(<实参表>);
例如:
class B
{
private:
int a;
public:
int c;
public:
A(int i) { a = i;};
int Fun(int b) { return ((a * c) + b); };
};
int main(int argc, char** argv)
{
B x()
int B::* pc = NULL; //声明指向类数据成员的指针pc;
pc = &(A::c); //为指向类数据成员的指针pc赋值;
x.*pc = ; //通过指向类数据成员的指针pc为对象的成员赋值;
int (B::*pFun)(int); //声明指向类成员函数的指针pFun;
pFun = A::Fun; //为指向类成员函数的指针pFun赋值为A::Fun;
A* px = &x; //声明指向类的对象x的指针px;
cout << (px->*pFun)(); //通过指向对象x的指针px来访问指向对象x的成员函数的指针pFun,并调用指向对象的成员函数指针所指向的成员函数;
;
}
-------------------------------------------------------------------------------------------------
自理解指向类数据成员的指针的结合性:
<类型说明符> (<类名>::*) <指针名> = &(<类名>::<数据成员名>)
int (A::*) pc = &(A::c);
或
(<类型说明符> <类名>::)* <指针名> = &(<类名>::<数据成员名>)
(int A::)* pc = &(A::c);
或
(<类型说明符> <类名>::) (*<指针名>) = &(<类名>::<数据成员名>)
(int A::) (*pc) = &(A::c);
可以把(*pc)作为整体,看作是对类A的数据成员c的引用,或者是 (*pc)<==>c;
即: (*<指针名>) <==> <数据成员名>
所以, A::(*pc) <==> A::c;
自理解指向类成员函数的指针的结合性:
<类型说明符> (<类名>::*<指针名>)(<参数表>) = <类名>::<成员函数名>;
int (A::*pFun)(int) = A::Fun;
或
<类型说明符> <类名>::*<指针名>(<参数表>) = <类名>::<成员函数名>;
int A::*pFun(int) = A::Fun;
或
<类型说明符> <类名>::(*<指针名>)(<参数表>) = <类名>::<成员函数名>;
int A::(*pFun)(int) = A::Fun;
可以把(*pFun)作为整体,看作是类A的成员函数名Fun;
即: (*pFun) <==> Fun;
所以,A::(*pFun) <==> A::Fun;
C++类成员指针(指向类成员的指针)的更多相关文章
- c++特性:指向类成员的指针和非类型类模板参数和函数指针返回值 参数推导机制和关联型别
一.c++允许定义指向类成员的指针,包括类函数成员指针和类数据成员指针 格式如下: class A { public: void func(){printf("This is a funct ...
- 类1(this指针/const成员函数/类作用域/外部成员函数/返回this对象的函数)
假设我们要设计一个包含以下操作的 Sales_data 类: 1.一个 isbn 成员函数,用于返回对象的 book_no 成员变量 2.一个 combine 成员函数,用于将一个 Sales_dat ...
- <六>指向类成员的指针
指向类成员(成员变量和成员方法)的指针 1:定义一个指针指向类的普通成员变量 示例代码1 点击查看代码 class Test2{ public: int ma; static int mb; void ...
- c/c++ 类成员变量,成员函数的存储方式,以及this指针在c++中的作用
c/c++ 类成员变量,成员函数的存储方式,以及this指针在c++中的作用 c++不会像上图那样为每一个对象的成员变量和成员函数开辟内存空间, 而是像下图那样,只为每一个对象的成员变量开辟空间.成员 ...
- c++ 指向类成员函数的函数指针
// ConsoleApplication34.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include <iostream& ...
- C++ 指向类成员函数指针的用法(转自维基百科)
类成员函数指针 类成员函数指针(member function pointer),是C++语言的一类指针数据类型,用于存储一个指定类具有给定的形参列表与返回值类型的成员函数的访问信息. 目录 1 语法 ...
- [Reprint]C++普通函数指针与成员函数指针实例解析
这篇文章主要介绍了C++普通函数指针与成员函数指针,很重要的知识点,需要的朋友可以参考下 C++的函数指针(function pointer)是通过指向函数的指针间接调用函数.相信很多人对指向一般 ...
- C++学习之普通函数指针与成员函数指针
函数指针(function pointer)是通过指向函数的指针间接调用函数.相信很多人对指向一般函数的函数指针使用的比较多,而对指向类成员函数的函数指针则比较陌生.我最近也被问到了这方面的问题,心中 ...
- c++父类指针强制转为子类指针后的测试(帮助理解指针访问成员的本质)(反多态)
看下面例子: #include "stdafx.h" #include <iostream> class A { //父类 public: void f() / ...
随机推荐
- Java读写文件,中文乱码解决
读文件:使用new BufferedReader(new InputStreamReader(new FileInputStream(file), "UTF-8")); Strin ...
- Hadoop Maven pom文件示例
Hadoop Maven pom文件示例 @(Hadoop) <?xml version="1.0" encoding="UTF-8"?> < ...
- Android-ImageView的属性android:scaleType作用
在网上查了好多资料,大致都雷同,大家都是互相抄袭的,看着很费劲,不好理解,自己总结一下,留着需要看的话来查找. 代码中的例子如下: <ImageView android:id="@+i ...
- TestNG 八 并发测试
一. Concurrenttesting: 下面的例子是输出进程ID,threadPoolSize用来指明线程池的大小,也就是并发的线程数目是多少 5次调用,有3个线程可调用 @Test(invoca ...
- linux 设置 亮度
调整系统运行的配置文件位于 /sys/class/ 文件夹下. 调整亮度在 /sys/class/backlight/XXXX/brightness XXXX 是因为使用的驱动不一样,名称就会不一样, ...
- android回调函数
在我们进行android开发的时候,常常遇到一些回调函数,当中,我们最常常使用的回调就是,当我们对一个组件设置监听的时候,事实上就相对于设置的回调函数.比如: Button btn = (Button ...
- 获取当前View
在实际开发中LayoutInflater这个类还是非常有用的,它的作用类似于findViewById().不同点是LayoutInflater是用来找res/layout/下的xml布局文件,并且实例 ...
- LaTeX数学公式输入
[置顶 Tips ] 在 WinEdt 中快速添加公式字符而不必手动打出一个个letters~: 即会出现如下 GUI Page Control : ------------------------- ...
- Linux 目录和文件操作
Linux常用命令--目录和文件操作 [目录]删除.复制.移动 : 1.删除文件夹用:rmdir 文件夹名 但是rmdir不能删除非空的文件夹,那如何删除非空文件夹呢: 2.通常情况下,删除文件用:r ...
- sql替换字符串部分内容
update 表名 set 字段名=replace(cast(与前面一样的字段名 as varchar(8000)) ,'原本内容','想要替换成什么') update News set news_d ...