1、成员指针(pointer to member)包含类的类型以及成员的类型。成员指针只应用于类的非static成员。static类成员不是任何对象的组成部分,所以不需要特殊语法来指向static成员,static成员指针是普通指针。通过指定函数的返回类型,形参表(类型和数目,是否为const)和所属类来定义成员函数的指针。

2、使用类成员的指针

类似于成员访问操作符 . 和 ->,.* 和 -> 是两个新的操作符,它们使我们能够将成员指针绑定到实际对象。这两个操作符的左操作数必须是类类型的对象或类类型的指针,右操作数是该类型的成员指针。

• 成员指针解引用操作符(.*)从对象或引用获取成员。

• 成员指针箭头操作符(->*)通过对象的指针获取成员。

示例代码

#include "iostream"
#include "string"
#include "vector"using namespace std;class Screen
{
public:Screen(std::string StrCon = "Here", std::string::size_type myCursor = 12):contents(StrCon), cursor(myCursor){}typedef std::string::size_type index;char get() const{return '1';};char get(index ht, index wd) const{return '2';};
public:std::string contents;index cursor;index height, width;
};int main()
{//定义的成员指针从右向左读string Screen::*ps_Screen = &Screen::contents; char (Screen::*pmf)() const = &Screen::get;char (Screen::*pmf1)(Screen::index,Screen::index) const = &Screen::get;Screen myScreen;//使用成员函数的指针char c1 = myScreen.get();char c2 = (myScreen.*pmf)();cout << c1 << " " << c2 << endl; // 1  1Screen *pScreen = &myScreen;c1 = pScreen->get();c2 = (pScreen->*pmf)();cout << c1 << " " << c2 << endl; // 1  1c1 = pScreen->get(0, 0);c2 = (pScreen->*pmf1)(0, 0);cout << c1 << " " << c2 << endl; // 2  2//使用数据成员的指针Screen::index Screen::*pIndex = &Screen::cursor;Screen::index ind1 = myScreen.cursor;Screen::index ind2 = myScreen.*pIndex;cout << ind1 << " " << ind2 << endl;return 1;
}

注意: (myScreen.*pmf)();不能省略括号。因为()的优先级比*高,所以如果省略括号,则解析成:myScreen.*(pmf());这段代码的意思是:调用名为pmf的函数,把函数的返回值绑定到成员对象操作符(.*)的指针。

2)成员指针函数表

函数指针和成员函数指针的一个公共用途是,将它们存储在函数表中。函数表是函数指针的集合,在运行时从中选择给定调用。

示例代码

#include "iostream"
#include "string"
#include "vector"using namespace std;class Screen {
public:// other interface and implementation members as before//Screen& home(){}; // cursor movement functions//Screen& forward(){};//Screen& back(){};//Screen& up(){};//Screen& down(){};int home() {return 1;}int forward(){return 1;}int back() {return 1;}int up(){return 1;}int down(){return 1;}
public:// other interface and implementation members as before// Action is pointer that can be assigned any of the cursor movement members//typedef Screen& (Screen::*Action)();typedef int (Screen::*Action)();static Action Menu[]; // function table
public:// specify which direction to moveenum Directions { HOME, FORWARD, BACK, UP, DOWN };Screen& move(Directions);
};
Screen& Screen::move(Directions cm)
{// fetch the element in Menu indexed by cm// run that member on behalf of this object(this->*Menu[cm])();return *this;
}
Screen::Action Screen::Menu[] =
{ &Screen::home,&Screen::forward,&Screen::back,&Screen::up,&Screen::down,
};
int main()
{Screen myScreen;myScreen.move(Screen::HOME); // invokes myScreen.homemyScreen.move(Screen::DOWN); // invokes myScreen.downreturn 1;
}

3、枚举的大小

示例代码

#include "iostream"
#include "string"
#include "vector"using namespace std;
class A
{
public:enum MyData{M1, M2, M3, M4};static int iMy;
};
int A::iMy = 1;
enum MyData{M1, M2, M3, M4};
int main()
{A Data1;cout << A::M1 << " " << A::M2 << " " << A::M3 << " "<< endl; //0 1 2cout << Data1.M1 << " " << Data1.M2 << " " << Data1.M3 << endl; //0 1 2//cout << A::MyData << endl; //“A::MyData”: 将此类型用作表达式非法cout << sizeof(A) << endl; //1cout << sizeof(Data1) << endl; //1cout << sizeof(MyData) << endl; //4MyData Data2;cout << sizeof(Data2) << endl; //4return 1;
}

枚举的大小为一个整形数据的大小。但是,在类中,求类的大小时,不计算数据成员的大小,同样也不计算枚举成员的大小。类中定义的枚举数据成员可以通过类名和作用域直接引用。

http://www.cnblogs.com/mydomain/archive/2011/04/30/2033483.html

4、我们需要注意的是,静态函数没有this指针。但是,类和类对象共享一份类中定义的静态数据成员。在非静态函数中可以通过this指针来引用这些静态数据成员。

示例代码

#include "iostream"
#include "string"
#include "vector"using namespace std;
class A
{
public:void Print(){cout << this->iMy << endl;}
public:static int iMy;
};
int A::iMy = 1;
int main()
{A Data1;Data1.Print(); //1cout << A::iMy << endl; //1Data1.iMy = 2;A Data2;cout << Data2.iMy << endl; //2return 1;
}

http://www.cnblogs.com/mydomain/archive/2011/03/22/1991449.html

5、函数指针的赋值

示例代码

#include <iostream>
using namespace std;char myfun()
{return '1';
}
char* myfun2()
{char *p = (char*)malloc(3);return p;
}int main()
{char (*p)() = myfun;//char* (p1()) = &myfun2; //error,无法从“char *(__cdecl *)(void)”转换为“char *(void)char* (*p1)() = &myfun2;//char *p() = myfun(); //注意,这样做是错误的,p被定义为一个函数,返回char*,而不是函数指针。return 1;
}

37、C++ Primer 4th笔记,特殊工具与技术,类成员指针相关推荐

  1. C++ 学习笔记之(19) new、delete表达式、RTTI(运行时类型识别)、枚举、类成员指针、嵌套类、局部类、位域、volatile、extern C

    C++ 学习笔记之(19) new.delete表达式.RTTI(运行时类型识别).枚举.类成员指针.嵌套类.局部类.位域.volatile.extern C C++ 学习笔记之(19) new.de ...

  2. 29、C++ Primer 4th 笔记,异常处理

    1.类成员的指针不同于指向普通数据或函数的指针,普通指针只根据对象或函数的类型而变化,而成员的指针必须反映成员所属的类. 2.异常是通过抛出对象而引发的.该对象的类型决定应该激活哪个处理代码.被选中的 ...

  3. 38、C++ Primer 4th笔记,特殊工具与技术,嵌套类

    1.在一个类内部再定义另外一个类,这样的类称为嵌套类(nested class),也称为嵌套类型(nested type).嵌套类最常用于执行类. 嵌套类是独立的类,基本上与它们的外围类不相关,因此, ...

  4. C++ Primer 5th笔记(chap 19 特殊工具与技术)成员函数指针

    1. 使用 classname::*的形式声明一个指向成员函数的指针. eg. / / pmf 是一个指针, 它可以指向 Screen 的某个常量成员函数 / / 前提是该函数不接受任何实参, 并且返 ...

  5. C++ Primer 5th笔记(chap 19 特殊工具与技术)类成员指针

    1. 成员指针( pointer to member) 指可以指向类的非静态成员的指针. 成员指针指示的是类的成员, 而非类的对象. 类的静态成员不属于任何对象, 因此无须特殊的指向静态成员的指针 指 ...

  6. 24、C++ Primer 4th 笔记,面向对象编程(2)

    1.每个派生类对象包含一个基类部分.因此派生类对象也是基类对象.可以将派生类对象的引用转换为基类子对象的引用,同理指针. 2.没有从基类引用(或基类指针)到派生类引用(或派生类指针)的(自动)转换. ...

  7. 42、C++ Primer 4th笔记,IO库,未格式化IO操作

    1.标准库还提供了丰富的支持未格式化IO的低级操作,这些操作使我们能够将流作为未解释的字节序列处理,而不是作为数据类型(如char,int,string等)的序列处理. 2.单字节操作 几个未格式化的 ...

  8. 20、C++ Primer 4th 笔记,重载运算符(1)

    1.除了函数调用符之外,重载操作符的形参数目(包括成员函数的隐式this指针)与操作符的操作数目相同.函数调用操作符可以接受任意数目的操作数. 表1 可重载的操作符名 + - * / % ^ & ...

  9. C++_Primer_学习笔记_第十九章(特殊工具和技术)

    第十九章(特殊工具与技术) /1.控制内存分配 1).不能直接应用标准内存管理机制. 某一些应用程序需要自定义内存分配的的细节,比如使用关键字new将对象放置在特定的内存空间中. 为了实现这一个目的, ...

最新文章

  1. java文件格式_Java Class文件格式详解
  2. Spring中的Spring JSR-250 注释
  3. 如何使用ABBYY FineReader 12将JPEG文件转换成Word文档
  4. php 重新组合数组_PHP数组组合
  5. Supper (Java)
  6. SLAM中直接法分类及对应的项目
  7. 计算机网络实验指导书 pdf,计算机网络实验指导书(新版).pdf
  8. 齐治运维堡垒机后台命令执行漏洞
  9. 申请苹果个人开发者经历
  10. C语言大写字母转小写字母
  11. 最新中国省市区SQL
  12. 4.OC仿写知乎客户端
  13. php异步执行shell脚本
  14. win10下的dos基本命令
  15. 论STM32标准库程序修改为HAL库
  16. 数据库系统概念第六版笔记
  17. 基于TIA西门子博途的触摸屏HMI脚本入门学习(一)
  18. 侯捷 - C++ Startup 揭密:C++ 程序的生前和死后 (四)
  19. 互联网下半场,实体店的转型思考
  20. 天池 IJCAI17《口碑商家客流量预测》回顾

热门文章

  1. 行为型模式:命令模式
  2. Babylon.js 3.3发布:更强大的粒子系统和WebVR支持
  3. 《Adobe InDesign CS6中文版经典教程》—第2课2.1节概述
  4. BZOJ 1923: [Sdoi2010]外星千足虫
  5. exit()与_exit()的区别(转)
  6. 网络名词--“环路”
  7. JQuery新浪1630个表情插件
  8. P2P之UDP穿透NAT的原理
  9. Win7中如何删除word模板
  10. GO语言编程基础-复合类型结构体