C++学习笔记(四)--指针(4).doc_第1页
C++学习笔记(四)--指针(4).doc_第2页
C++学习笔记(四)--指针(4).doc_第3页
C++学习笔记(四)--指针(4).doc_第4页
C++学习笔记(四)--指针(4).doc_第5页
全文预览已结束

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

C+学习笔记(四)-指针(4) 分类: C+学习笔记 2010-04-03 14:13 267人阅读 评论(0) 收藏 举报 类成员指针 本文主要讨论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 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 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 *Menudirc)();return *this;int main()Screen sc;sc.move(Scree

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论