37、C++ Primer 4th笔记,特殊工具与技术,类成员指针
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笔记,特殊工具与技术,类成员指针相关推荐
- C++ 学习笔记之(19) new、delete表达式、RTTI(运行时类型识别)、枚举、类成员指针、嵌套类、局部类、位域、volatile、extern C
C++ 学习笔记之(19) new.delete表达式.RTTI(运行时类型识别).枚举.类成员指针.嵌套类.局部类.位域.volatile.extern C C++ 学习笔记之(19) new.de ...
- 29、C++ Primer 4th 笔记,异常处理
1.类成员的指针不同于指向普通数据或函数的指针,普通指针只根据对象或函数的类型而变化,而成员的指针必须反映成员所属的类. 2.异常是通过抛出对象而引发的.该对象的类型决定应该激活哪个处理代码.被选中的 ...
- 38、C++ Primer 4th笔记,特殊工具与技术,嵌套类
1.在一个类内部再定义另外一个类,这样的类称为嵌套类(nested class),也称为嵌套类型(nested type).嵌套类最常用于执行类. 嵌套类是独立的类,基本上与它们的外围类不相关,因此, ...
- C++ Primer 5th笔记(chap 19 特殊工具与技术)成员函数指针
1. 使用 classname::*的形式声明一个指向成员函数的指针. eg. / / pmf 是一个指针, 它可以指向 Screen 的某个常量成员函数 / / 前提是该函数不接受任何实参, 并且返 ...
- C++ Primer 5th笔记(chap 19 特殊工具与技术)类成员指针
1. 成员指针( pointer to member) 指可以指向类的非静态成员的指针. 成员指针指示的是类的成员, 而非类的对象. 类的静态成员不属于任何对象, 因此无须特殊的指向静态成员的指针 指 ...
- 24、C++ Primer 4th 笔记,面向对象编程(2)
1.每个派生类对象包含一个基类部分.因此派生类对象也是基类对象.可以将派生类对象的引用转换为基类子对象的引用,同理指针. 2.没有从基类引用(或基类指针)到派生类引用(或派生类指针)的(自动)转换. ...
- 42、C++ Primer 4th笔记,IO库,未格式化IO操作
1.标准库还提供了丰富的支持未格式化IO的低级操作,这些操作使我们能够将流作为未解释的字节序列处理,而不是作为数据类型(如char,int,string等)的序列处理. 2.单字节操作 几个未格式化的 ...
- 20、C++ Primer 4th 笔记,重载运算符(1)
1.除了函数调用符之外,重载操作符的形参数目(包括成员函数的隐式this指针)与操作符的操作数目相同.函数调用操作符可以接受任意数目的操作数. 表1 可重载的操作符名 + - * / % ^ & ...
- C++_Primer_学习笔记_第十九章(特殊工具和技术)
第十九章(特殊工具与技术) /1.控制内存分配 1).不能直接应用标准内存管理机制. 某一些应用程序需要自定义内存分配的的细节,比如使用关键字new将对象放置在特定的内存空间中. 为了实现这一个目的, ...
最新文章
- java文件格式_Java Class文件格式详解
- Spring中的Spring JSR-250 注释
- 如何使用ABBYY FineReader 12将JPEG文件转换成Word文档
- php 重新组合数组_PHP数组组合
- Supper (Java)
- SLAM中直接法分类及对应的项目
- 计算机网络实验指导书 pdf,计算机网络实验指导书(新版).pdf
- 齐治运维堡垒机后台命令执行漏洞
- 申请苹果个人开发者经历
- C语言大写字母转小写字母
- 最新中国省市区SQL
- 4.OC仿写知乎客户端
- php异步执行shell脚本
- win10下的dos基本命令
- 论STM32标准库程序修改为HAL库
- 数据库系统概念第六版笔记
- 基于TIA西门子博途的触摸屏HMI脚本入门学习(一)
- 侯捷 - C++ Startup 揭密:C++ 程序的生前和死后 (四)
- 互联网下半场,实体店的转型思考
- 天池 IJCAI17《口碑商家客流量预测》回顾
热门文章
- 行为型模式:命令模式
- Babylon.js 3.3发布:更强大的粒子系统和WebVR支持
- 《Adobe InDesign CS6中文版经典教程》—第2课2.1节概述
- BZOJ 1923: [Sdoi2010]外星千足虫
- exit()与_exit()的区别(转)
- 网络名词--“环路”
- JQuery新浪1630个表情插件
- P2P之UDP穿透NAT的原理
- Win7中如何删除word模板
- GO语言编程基础-复合类型结构体