类成员指针
本文主要讨论C++中类成员的指针,这部分内容少有使用,也比较难于理解。
如果文中有错误或遗漏之处,敬请指出,谢谢!
需要使用类成员指针的情况是比较少见的,所以一般没人使用这个语言特性。下面先介绍类成员指针的使用方法,再介绍它的可能应用场合。
有时,我们需要在类外的其它地方直接获得类成员,这时我们就需要使用类成员指针。类成员指针与对象的指针不同,它不仅包括类的类型,还包括成员的类型。成员指针只应用于类的非static成员,因为static类成员不是任何对象的组成部分,只需使用普通指针即可。
声明成员指针
借用书上的一个例子,有这么一个类:
class Screen {
public:
typedef std::string::size_type index;
char get() const;
char get(index ht, index wd) const;
private:
std::string contents;
indexcursor;
indexheight, width;
};
若要声明contents成员的指针,应有如下形式:
string Screen::*ps;
若要声明cursor、height或width成员的指针,应有如下形式:
Screen::index Screen::*pi;
从上面的使用形式可以看出,使用类成员的指针与普通指针的区别在于,需要在类成员指针前面的加上类限定符,以指明是哪个类的成员指针。同样,在初始化指针时,也只能用相应类的相应类型的成员对指针进行初始化,例如:
ps = &Screen::contents;
pi = &Screen::cursor;
上面介绍了对类数据成员的指针的使用方法,下面对函数成员的指针进行介绍。
函数成员的指针与普通函数指针相比,也多了类限定符。由于类成员函数还有可能是const,所以const也成为成员函数指针声明的一部分。也就是说,函数成员的指针必须在三个方面与它所指函数的类型相匹配:
(1)函数形参的类型和数目;
(2)返回类型及是否为const函数;
(3)所属类的类型。
例如,要定义Screen的get成员的指针,可以如下定义:
char (Screen::*pmf)()const = &Screen::get; // not 'Screen::get'!
char (Screen::*pmf2)(Screen::index, Screen::index) const;
pmf2 = &Screen::get;
这里需要注意的是:(1)这里不存在函数类型到函数指针类型的自动转换(即类成员函数前面必须加上&,然后再给相应指针赋值);(2)运算符的优先级关系(注意指针外层的括号所起的作用);(3)函数到指针的自动类型匹配(注意两个重载版本的get对指针的赋值)。
使用类成员指针
要使用类成员指针所指对象,首先应当从类对象取得成员指针,再解引用指针,所以有如下两种操作符供使用:.*和->*。这两个操作符的左操作数必须是类类型的对象或类类型的指针,右操作数是该类型的成员指针。例如:
Screen sc;
char c = (sc.*pmf)(); //
等价于调用sc.get();
Screen *pS = ≻
c = (pS->*pmf)();
下面给出成员指针使用的完整例子,以方便读者更好的理解:
#include
<string>
class Screen
{
friend
void func();
// 声明func为类Screen的友元,否则无法使用类成员
public:
typedef
std::string::size_type index;
char get()
const {
return
'a';
}
char get(index ht,
index wd)
const {
return
'b';
}
private:
std::string contents;
index cursor;
index heigth,
width;
};
void func()
{
std::string Screen::
*ps =
&Screen::contents;
Screen::index
Screen::
*pi
=
&Screen::cursor;
char
(Screen::
*pmf)
() const
= &Screen::get;
// not 'Screen::get'!
char
(Screen::
*pmf2)
(Screen::index, Screen::index)
const;
pmf2
=
&Screen::get;
Screen sc;
Screen
*pS
=
≻
Screen::index
idx = sc.*pi;
idx
= pS->*pi;
char c
= (sc.*pmf)();
// 等价于调用sc.get();
c
=
(pS->*pmf)();
}
int main()
{
void
(*pf)()
= func;
// 注意普通函数的指针的初始化,与成员指针比较
pf();
return 0;
}
成员指针的应用举例
当一个类有多个性质相同且类型相同的函数成员时,可以使用函数表来进行函数调用,产生用同一函数使用不同参数来达到不同操作的效果,而实际上是调用了不同的函数来实现的。下面给出这样的一个例子,方便读者有一个感性的认识:
#include
<iostream>
using
namespace
std;
class Screen
{
public:
Screen&
home()
{
cout
<< "Home"
<< endl;
return
*this;
}
Screen&
forward()
{
cout
<< "Forward"
<< endl;
return
*this;
}
Screen&
back()
{
cout
<< "Back"
<< endl;
return
*this;
}
Screen&
up()
{
cout
<< "Up"
<< endl;
return
*this;
}
Screen&
down()
{
cout
<< "down"
<< endl;
return
*this;
}
// function table
typedef Screen&
(Screen::
*Action)();
static Action Menu[];
// specify which direction to move
enum Directions
{HOME, FORWARD, BACK,
UP, DOWN};
Screen&
move(Directions);
};
Screen::Action Screen::Menu[]
= {&Screen::home,
&Screen::forward,
&Screen::back,
&Screen::up,
&Screen::down};
Screen& Screen::move(Directions
dirc)
{
(this->*Menu[dirc])();
return
*this;
}
int main()
{
Screen sc;
sc.move(Screen::HOME);
sc.move(Screen::UP);
return 0;
}
参考文献:
[1] C++ Primer(Edition 4)
[2] Thinking in C++(Edition 2)
[3] International Standard:ISO/IEC 14882:1998
源文档 <http://blog.chinaunix.net/u/18517/showart_272646.html>
分享到:
相关推荐
C++学习笔记--函数指针 函数指针 程序运行期间。每个函数都会占用一段连续的内存空间。而函数名就是该函数所占内存区域的起始地址(也称“入口地址”)。我们可以将函数入口地址赋给一个指针变量,使该指针变量...
C++学习笔记,博主个人向。内容是C++面对对象的,目录大致来源于菜鸟文档的C++面向对象,笔记是参考各种文章以及菜鸟文档改编的,内容包含C++类和对象(类定义和对象定义,类成员函数,类访问修饰符,友元函数,内联...
这是我研究生两年来,学习C++和做项目中遇到问题,然后总结出来的一些文件 包含c++ 线程 指针 调试 编码等方面 。rar中包含30个word文档文件。
C++基础的学习笔记(其中的代码源件可私信留言) C++中的空头程序 使用C++书写hello world 学习变量 学习常量 标识符命名规则 数据类型 运算符 程序流程结构 数组 函数 指针 结构体
C++学习笔记和实践项目,实践项目包括Json工具类、设计模式的C++实现、消息队列、智能指针,linux下的并发控制工具、线程池,epoll管理器和Mysql连接池、STL容器的快捷输出工具和页面置换算法(FIFO, LRU, LFU)的...
C++指针精髓 笔记
《Effective Modern C++:改善C++11和C++14的42个具体做法(影印版)(英文版)》中包括以下主题:剖析花括号初始化、noexcept规范、完美转发、智能指针make函数的优缺点;讲解std∷move,std∷forward,rvalue引用和全局...
C++学习笔记和常见面试知识点,C++11特性,包括多态、虚表、移动语义、友元函数、符号重载、完美转发、智能指针、const和static、数组指针和指针数组、struct内存对齐、enum和union关键字等等。帮助了解C++的特性,...
很多的笔记 完全自己总结学习 如声明、指针、数据结构等一系列很值得深思的问题!
C++提供了一种更加灵活,更安全的方式来定义常量,即使用const修饰符来定义常量这个常量LIMIT是有类型的,占用存储单元,有地址,可以用指针指向它,但不能修
C++ primer plus学习笔记之三,分为一下几个部分: 函数参数:介绍了函数的生命规则以及定义 数组函数:数组作为变量时的使用方法 指针和const:灵活运用指针和const 函数和二维数组:二维数组作为变量时声明以及定义...
C++全方位的学习笔记比如指针理解,全局变量,const,类的虚函数等等.word格式的60页,内容相当丰富有用,不少知识点是面试时常考的。
一。指针的概念 二。指针的算术运算 三。运算符&和* 四。指针表达式 五。数组和指针的关系
C++中的类成员声明static;strlen函数计算首地址到'\0'间的元素数目,不包括'\0';指针的含义:int* a;那么*a意思是取值,取多少字节呢,就取sizeof(int)个字节,并读取为一个int型整数。A* a;那么*a会取sizeof(A)个...
.
.
该资源为本人在网上收集的一些资源,很有助于对于C++指针的学习,其中包括30天掌握C++精髓,C++指针精髓,C++类中的各种成员、嵌套类、友元、this指针专题,c++指针经典应用、多年学习笔记等,谢谢这些资源的分享者...
本文主要给大家介绍了关于C++中pimpl用法的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍: C++的pImpl可以说是最常见的惯用手法了,在很多的C++项目和C++开发库中都有所见。plmp的...
——太棒了——c++学习笔记和常见面试知识点,c++ 11特性,包括多态原理,虚表,移动语义,友元函数,符号重载,完美转发,函数指针,智能指针,常量和静态的,数组指针和指针数组,结构内存对齐,枚举和联盟关键字等等,还新添了...
本人学习笔记,从基础逐步深入,其中还包括内存、指针、等内容,很适合c++程序员使用