c++ 模板 类成员函数指针的问题

c++ 模板 类成员函数指针的问题,第1张

构造一个指向成员指针需要显式使用 address-of 运算符('&')和限定名

这里,限定名一般是 “X::” 形式

所以,修改成这样:

print(&print2, &printclass::print);

就可以了

这是语法的规定,print2print 这个在编译器看来是:

(printclass)print(&print2);

与void (printclass::b)()这种形式并不匹配,如果你知道了 this 指针的定义,作用,应该能弄明白;&printclass::print 是不带 this 指针的“纯”函数,可用于模板实参推导。

继续加油,类与模板的结合功能就是强。

采用取成员函数指针的地址的方法,先把指向成员函数指针的指针强制转化为别的类型,如unsigned,当然同样可以通过此转化后的指针经过相反的变换来调用成员函数。于是乎要转化为void的问题也随之可解,如下示例: / VS2003下编译运行 /

一定要写,就像你平时调用函数一样。比如max(int

x,int

y)

括号里表示的是调用的参数,即使函数调用没有参数也要带上括号,表示此函数空参。就像show()一样,没有参数也要加括号

1 this指针的用处:

一个对象的this指针并不是对象本身的一部分,不会影响sizeof(对象)的结果。this作用域是在类内部,当在类的非静态成员函数中访问类的非静态成员的时候,编译器会自动将对象本身的地址作为一个隐含参数传递给函数。也就是说,即使你没有写上this指针,编译器在编译的时候也是加上this的,它作为非静态成员函数的隐含形参,对各成员的访问均通过this进行。

例如,调用dateSetMonth(9) <===> SetMonth(&date, 9),this帮助完成了这一转换

2 this指针的使用:

一种情况就是,在类的非静态成员函数中返回类对象本身的时候,直接使用 return this;另外一种情况是当参数与成员变量名相同时,如this->n = n (不能写成n = n)。

3 this指针程序示例:

this指针是存在与类的成员函数中,指向被调用函数所在的类实例的地址。

根据以下程序来说明this指针

#include<iostreamh>

class Point

{

int x, y;

public:

Point(int a, int b) { x=a; y=b;}

void MovePoint( int a, int b){ x+=a; y+=b;}

void print(){ cout<<"x="<<x<<"y="<<y<<endl;}

};

void main( )

{

Point point1( 10,10);

point1MovePoint(2,2);

point1print( );

}

当对象point1调用MovePoint(2,2)函数时,即将point1对象的地址传递给了this指针。

MovePoint函数的原型应该是 void MovePoint( Point this, int a, int b);第一个参数是指向该类对象的一个指针,我们在定义成员函数时没看见是因为这个参数在类中是隐含的。这样point1的地址传递给了this,所以在MovePoint函数中便显式的写成:

void MovePoint(int a, int b) { this->x +=a; this-> y+= b;}

即可以知道,point1调用该函数后,也就是point1的数据成员被调用并更新了值。

即该函数过程可写成 point1x+= a; point1 y + = b;

4 关于this指针的一个经典回答:

当你进入一个房子后,

你可以看见桌子、椅子、地板等,

但是房子你是看不到全貌了。

对于一个类的实例来说,

你可以看到它的成员函数、成员变量,

但是实例本身呢?

this是一个指针,它时时刻刻指向你这个实例本身

这需要使用两个特别指定的 *** 作符:

::用来定义指向类成员函数的指针

->用来调用函数

看代码:

#include<cstdio>

class MyPtrTestClass

{

public:        

        MyPtrTestClass()

        {

            m_iVal = 0;//初始为零        

        }

        //定义指向类的成员函数指针别名

        typedef void (MyPtrTestClass::Action)();

        //参数为指向类的成员函数的指针

        void Repeat(Action actOp, int iTimes)

        {

            for (int i = 0; i < iTimes; ++i)

            {

                (this->actOp)();//调用指定的函数

            }

        }

        void AddVal()

        {

            ++m_iVal;

        }

        

        void SubVal()

        {

            --m_iVal;

        }        

        void ShowVal()

        {

                printf("The value is:%d\n", m_iVal);

        }           

        int m_iVal;

};

int main(int argc, char argv[])

{

    MyPtrTestClass myClass;

    //调用Addval成员函数

    myClassRepeat(&MyPtrTestClass::AddVal, 20);

    myClassShowVal();

    //调用SubVal成员函数

    myClassRepeat(&MyPtrTestClass::SubVal, 100);

    myClassShowVal();

    

    return 0;

}

测试截图:

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/12156610.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-21
下一篇 2023-05-21

发表评论

登录后才能评论

评论列表(0条)

保存