成员函数指针

1.对于成员函数,用到函数名的地方,函数名表示的意义与全局函数或静态函数有所区别,函数名只表示函数名称(或函数变量(对象))。如:对成员函数中调用test()是可以的,但调用(*test)()是非法的,显示Error:“*”的操作数必须是指针。这表示test不能再表示指针(在全局函数中不存在此问题),&test也是不行的。

2.对于在调用成员函数时,A::test()与test()在类内部是一样的,都A::表示test()与类A绑定了。在外部表示不一样A::表示要调用静态的成员函数。

3.对于int *C::func();和int C::(*func)();是不同的。int *C::func()等价于int *func();。int C::(*func)()和int (*func)()也是不一样的。对于int (*func)()这样的函数指针定义直接用一个函数地址定义,没有对象绑定,对于类成员函数,有类型的绑定,成员函数地址是和全局函数地址表示不同,和类型相关,直接赋值函数地址定义的话不行。那么这就出现一个定义叫类成员(函数或变量)指针。先看如下程序:

class C
{

public:

 void (C::*func1)();//放到类外一样

 void func2() { cout << "func2()" << endl; }

 void (*func3)();

 void test()

 {

  func1 = &func2;//error

  func1 = &C::func2;

  (this->*func1)();

  i3 = &i1;//虽然对于成员函数无法直接取其地址,成员变量可以直接取其地址

 }

public:

 int i1;

 int C::i2;

 int *C::i3;
};

我们想给func3赋值时,但不想用全局函数和类内静态函数,而想用类成员函数赋值,那么

func3 = func2//这样不对,因为类成员函数单独使用名字(*func2, &func2, C c, c.func, &(c.func), *(c.func) 都是错误的,但全局函数,静态函数都可以),只能用于函数调用。

c++规定了一个类成员函数指针作为特殊的函数指针。即:

func1 = &C::func;//正确

对于类变量指针,虽然对于成员函数无法直接取其地址,成员变量可以直接取其地址。同样类变量指针可以和成员函数指针一样特殊的定义。

int C::*i1; i1 = &C::i2;

成员函数/变量指针通过.*或->*访问

调用

c.*func1();//正确

&(c.*func1)//错误,因为指向绑定函数的指针,只能用于函数调用。

c.*i1;//正确

&(c.*i1)//也是正确的

4.(参考)由于成员函数与类绑定(成员函数默认有个参数为类对象,所以取其指针时候,该函数有个默认的参数没有直接表明,为了表明要用A::修饰),那么取函数指针时,c++规定要显示注明A::(函数调用不必要)&A::test。如:

#include <iostream>
using namespace std;

class A
{
public:
 void (A::*fun)();
 void test(){ cout << "ok" << endl; }
public:
 void doTest();
};

void A::doTest()
{
 fun=&A::test;
 (this->*fun)();
}
int main()
{
 A a;
 a.doTest();

 &A::test//甚至在外边也可以访问到
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
CruiseYoung提供的带有详细书签的电子书籍目录 http://blog.csdn.net/fksec/article/details/7888251 该资料是《Visual C++ 2005入门经典》的源代码及课后练习答案 对应的书籍资料见: Visual C++ 2005入门经典 基本信息 原书名: Ivor Horton's Beginning Visual C++ 2005 原出版社: Wiley 作者: (美)Ivor Horton 译者: 李颂华 康会光 出版社:清华大学出版社 ISBN:9787302142713 上架时间:2007-2-12 出版日期:2007 年1月 开本:16开 页码:1046 版次:1-1 编辑推荐   本书由编程语言先驱者Ivor Horton倾力而著,是国内第一本全面、深入介绍Visual C++ 2005的经典之作! 内容简介   本书系编程语言先驱者Ivor Horton的经典之作,是学习C++编程最畅销的图书品种之一,不仅涵盖了Visual C++ .NET编程知识,还全面介绍了标准C++语言和.NET C++/CLI。本书延续了Ivor Horton讲解编程语言的独特方法,从中读者可以学习Visual C++ 2005的基础知识,并全面掌握在MFC和Windows Forms中访问数据源的技术。此外,本书各章后面的习题将有助于读者温故而知新,并尽快成为C++高效程序员。...    作译者   Ivor Horton是世界著名的计算机图书作家,主要从事与编程相关的顾问及撰写工作,曾帮助无数程序员步入编程的殿堂。他曾在IBM工作多年,能使用多种语言进行编程(在多种机器上使用汇编语言和高级语言),设计和实现了实时闭环工业控制系统。Horton拥有丰富的教学经验(教学内容包括C、C++、Fortran、PL/1、APL等),同时还是机械、加工和电子CAD系统、机械CAM系统和DNC/CNC系统方面的专家。Ivor Horton还著有Beginning Visual C++ 6、Beginning C Programming和Beginning Java 2等多部入门级好书。 目录 封面 -18 前言 -14 目录 -9 第1章 使用Visual C++ 2005编程 1 1.1 .NET Framework 1 1.2 CLR 2 1.3 编写C++应用程序 3 1.4 学习Windows编程 4 1.4.1 学习C++ 4 1.4.2 C++标准 5 1.4.3 控制台应用程序 5 1.4.4 Windows编程概念 6 1.5 集成开发环境简介 7 1.6 使用IDE 9 1.6.1 工具栏选项 9 1.6.2 可停靠的工具栏 10 1.6.3 文档 11 1.6.4 项目和解决方案 11 1.6.5 设置Visual C++ 2005的选项 23 1.6.6 创建和执行Windows应用程序 24 1.6.7 创建Windows Forms应用程序 26 1.7 小结 29 第2章 数据、变量和计算 31 2.1 C++程序结构 31 2.1.1 程序注释 36 2.1.2 #include指令——头文件 37 2.1.3 命名空间和using声明 37 2.1.4 main()函数 38 2.1.5 程序语句 38 2.1.6 空白 40 2.1.7 语句块 41 2.1.8 自动生成的控制台程序 41 2.2 定义变量 42 2.2.1 命名变量 43 2.2.2 C++中的关键字 43 2.2.3 声明变量 44 2.2.4 变量的初值 44 2.3 基本数据类型 45 2.3.1 整型变量 45 2.3.2 字符数据类型 46 2.3.3 整型修饰符 47 2.3.4 布尔类型 48 2.3.5 浮点类型 48 2.3.6 ISO/ANSI C++中的基本类型 49 2.3.7 字面值 50 2.3.8 定义数据类型的同义词 50 2.3.9 具有特定值集的变量 51 2.3.10 指定枚举常量的类型 52 2.4 基本的输入/输出操作 53 2.4.1 从键盘输入 53 2.4.2 到命令行的输出 53 2.4.3 格式化输出 54 2.4.4 转义序列 55 2.5 C++中的计算 57 2.5.1 赋值语句 57 2.5.2 算术运算 58 2.5.3 计算余数 63 2.5.4 修改变量 63 2.5.5 增量和减量运算符 64 2.5.6 计算

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值