构造一个指向成员的指针需要显式使用 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;
}
测试截图:
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)