类成员的指针

ps:const对象只能调用const函数!!非const对象随便!!

成员指针只应用于类的非 static
成员。static 类成员不是任何对象的组成部分,所以不需要特殊语法来指向 static
成员,static
成员指针是普通指针。

int *p = &Screen::total;   
(total 是 static int total;)

例子:

#include<iostream>

using namespace std;

class Screen{

public:

static int total;

int sum;

Screen():sum(2){}

int a(int i, int j){

cout<<244<<endl;

return 8;

}

};

int Screen::total = 6;

int main(){

Screen sc;

int *ptr = &Screen::total;

int Screen::*p1 = &Screen::sum;

int (Screen::*p2)(int, int) = &Screen::a;

cout<<sc.*p1<<"**"<<sc.total<<"**"<<(sc.*p2)(1,2)<<endl;

cout<<*ptr<<endl;

return 0;

}

输出:

244     
----------先出来

2**6**8

l  声明成员指针

class Screen {

public:

typedef std::string::size_type index;

char get() const;

char get(index ht, index wd) const;

private:

std::string contents;

index cursor;

index height, width;

};

ü  定义数据成员的指针

如contents

string Screen::*ptr = &Screen::contents;

Screen::index
Screen::
*p = &Screen::cursor;

ü  定义成员函数的指针

成员函数的指针必须在三个方面与它所指函数的类型相匹配:

1.
函数形参的类型和数目,包括成员是否为 const。

2.
返回类型。

3.
所属类的类型。

如get()

char (Screen::*p)()const = &Screen::get;

char (Screen::*p)(Screen::index,
Screen::index)const = &Screen::get;

ü  为成员指针使用类型别名

typedef char (Screen::*Action)(Screen::index, Screen::index) const;

Action p = &Screen::get;

l  使用类成员指针


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

ps:不能重载的操作符(:: 
.  .*  ?:

必须成员函数(= 
[]  ()  ->

必须友元(<<  
>>


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

ü  使用成员函数指针

char (Screen::*pmf)() const = &Screen::get;

Screen myScreen;

char c1 = myScreen.get();

char c2 =
(myScreen.*pmf)(); // equivalent call to get

Screen *pScreen = &myScreen;

c1 = pScreen->get();

c2 = (pScreen->*pmf)(); // equivalent call to get

因为调用操作符(())比成员指针操作符优先级高,所以调用(myScreen.*pmf)()
和 (pScreen->*pmf)() 需要括号。

ü  使用数据成员指针

Screen::index Screen::*pindex = &Screen::width;

Screen myScreen;

Screen::index ind1 = myScreen.width;

Screen::index ind2 = myScreen.*pindex; // dereference to get width

Screen *pScreen;

ind1 = pScreen->width;

ind2 = pScreen->*pindex;
// dereference pindex to get width

ps:不要加括号!!!

****************成员函数的指针不同与普通函数的指针************

成员函数的指针:

char (Screen::*pmf)() const = &Screen::get;   
 //必须有&

使用是
(myScreen.*pmf)() 或者
(pScreen->*pmf)()

 

普通函数的指针:

char (*pmf)() const = &get;  
或者   
char (*pmf)() const =get;

使用是 
pmf() 
或者
 (*pmf)()

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-10 17:11:53

类成员的指针的相关文章

C++中如何获取类成员的指针

 我们都知道C++ class中有三种成员函数,static(静态的),nonstatic(非静态的),virtual(虚拟的)各种成员函数的指针各有区别,以下是一个完整的例子:(注意红颜色的区别) class A { public: static void staticmember(){cout<<"static"<<endl;}   //static member void nonstatic(){cout<<"nonstatic&

C++的类成员和类成员函数指针

类成员函数指针: 用于访问类成员函数,和一般函数指针有区别. 类成员函数处理的是类数据成员,声明类成员函数指针的同时,还要指出具体是哪个类的函数指针才可以.调用时也要通过对象调用. 而对于类的静态成员函数,它是类对象共享的,且只能处理静态数据成员,所以它的函数指针可以类似一般函数指针一样使用. 1 class Test 2 { 3 public: 4 void fun(int); 5 void fun(int) const; //重载函数,加一个const限制 6 static void fun

让类成员函数指针成为可调用对象

类成员函数指针实践上是一个指针类型,不可直接通过调用运算符()作为可调用对象调用,一般调用该类成员函数指针需要指定该指针对应的对象. 一般情况下调用类成员函数指针: // a.h #ifndef A_H #define A_H #include <iostream> using std::cout; using std::endl; class A{ public:     void print(); }; #endif // a.cpp #include "a.h" vo

C/C++ 类成员函数指针 类成员数据指针

普通函数指针:  "return_type (*ptr_name)(para_types) " 类成员函数指针: "return_type (class_name::*ptr_name)(para_types)" 类数据成员指针: "type class_name::* ptr_name"; C/C++: 1 class Demo 2 { 3 public: 4 Demo():data(100) 5 { 6 7 } 8 int data; 9 i

函数指针与类成员函数指针

1,函数指针函数指针,顾名思义就是函数的指针,而指针其实就是地址,那么函数指针就是存储函数的地址,可是实际大部分时间里,我们写程序时是根本不会去考虑函数地址在哪里.我们只需要知道函数原型和函数声明就可以.但是想象一下,我们总是以为函数就应该接收参数,那么函数本身是否可以作为函数的参数呢?我做了下面的一个实验 #include<iostream>#include<stdio.h>#include<cstring>using namespace std;typedef in

C++中怎样获取类成员的指针

 我们都知道C++ class中有三种成员函数,static(静态的),nonstatic(非静态的),virtual(虚拟的)各种成员函数的指针各有差别,下面是一个完整的样例:(注意红颜色的差别) class A { public: static void staticmember(){cout<<"static"<<endl;}   //static member void nonstatic(){cout<<"nonstatic&

C++拾遗--类成员指针

C++拾遗--类成员指针 前言 类成员的类型与一般类型不同,那么类成员的指针类型自然与一般类型的指针有所区别.我们有必要来探讨下类成员指针的使用. 正文 类成员指针是指可以指向类的非静态成员的指针.它的类型包括了类类型和所指向的成员类型.一般而言,指针指向的是对象,而类成员指针指向的是类成员而非类对象. 需要指出,类成员指针不是可调用对象,要想通过类成员指针调用类成员,需结合类对象或类指针.静态类型成员属于类,类型与普通指针相似. 数据成员指针 一般的声明形式: 成员类型 classname::

类的成员函数指针(比較深入)

From:http://blog.csdn.net/hairetz/archive/2009/05/06/4153252.aspx 个人感觉对于类的成员函数指针这块解说的比較深入具体 推荐阅读 ///////////////////////////////////////////////// 先看这样一段代码 class test {    public:       test(int i){ m_i=i;}       test(){} void hello()       {        

C++ Primer 学习笔记_103_特殊工具与技术 --类成员指针

特殊工具与技术 --类成员指针 成员指针可以做到:获得特定成员的指针,然后从一个对象或别的对象获得该成员.成员指针应该包含类的类型以及成员的类型. 一.声明成员指针 测试类: class Screen { public: typedef std::string::size_type index; char get() const; char get(index ht,index wd) const; private: std::string contents; index cursor; ind