
1友元函数和类的成员函数都可以访问类的私有成员变量或者是成员函数,但是他们调用的形式不同。
2成员函数是属于类的,所以调用的时候是通过指针this调用的。而友元函数不属于类,当然也不能有this指针了,也就是在友元函数中不能出现this指针。同时友元函数是有关键字friend修饰。
3再有的情况下,友元函数是很有用的。特别是在重载一些 *** 作符的时候用处很明显。
class A{
void foo(int n) {}
int m_n;
};
void (A::pfun)(int) = &A::foo; //必须写取地址符
A a;
apfunc(10); //() 对象成员指针解引用运算符
A pa = &a;
pa->pfun(10); //(->)对象成员指针解引用运算符
虾米意思?是指类的成员变量是否可以指向类中的成员函数吗?如果这样子的,类的成员函数指针就是用来起这个作用,mfc消息路由机制也是机遇此原理。#include <stdioh>class A{public: A() \/\/ Ctor { m_pfn1 = A::foo; \/\/ 有没有取地址符号一样 m_pfn2 = &A::bar; (this->m_pfn1)(); (this->m_pfn2)(0); } void foo(){printf("foo\n");} \/\/ 类函数 virtual void bar(int){printf("bar\n");} void (A::m_pfn1)(); \/\/ 类函数指针成员变量 void (A::m_pfn2)(int); \/\/ 类函数指针成员变量};int _tmain(int argc, _TCHAR argv[]){ \/\/ 1 类函数指针成员变量的使用 A a; A p = &a; (a(am_pfn1))(); (a(am_pfn2))(0); \/\/ 多态 (p->(p->m_pfn1))(); (p->(p->m_pfn2))(0); \/\/ 多态 \/\/ 2 类外函数指针变量的使用 typedef void (A::MemFunPtr)(); MemFunPtr memPtr = &A::foo; (amemPtr)(); (p->memPtr)(); return 0;}\r\n补充:\r\n-> 和 是C++新增加的 *** 作符号,专用类成员指针变量取址(成员函数指针,成员变量指针)\r\n
首先 函数指针是指向一组同类型的函数的指针;而类成员函数我们也可以相似的认为,它是指向同类中同一组类型的成员函数的指针,当然这里的成员函数更准确的讲应该是指非静态的成员函数。前者是直接指向函数地址的,而后者我们从字面上也可以知道 它肯定是跟类和对象有着关系的。
函数指针实例:
代码如下:
typedef int (p)(int,int);//定义一个接受两个int型且返回int型变量的函数指针类型
int func(int x,int y)
{
printf("func:x=%d,y=%d/n",x,y);
return (x<yx:y);
}
int main()
{
p fun=func;//定义函数指针并给它赋上一个函数指针
cout<<"min:"<<(fun)(4,5)<<endl;//为什么fun需要用()扩起来呢因为的运算符优先级比()低,如果不用()就成了(fun())
return 0;
}
而“指向类成员函数的指针”却多了一个类的区别:
class A
{
public:
int func(int x,int y)
{
printf("A::func:x=%d,y=%d/n",x,y);
return (x<yx:y);
}
};
typedef int (A::p)(int,int);//指针名前一定要加上所属类型类名 A::的限定
int main()
{
p fun=&A::func;
A a; //因为成员函数地址的解引用必须要附驻与某个对象的地址,所以我们必须创建某个对象。
cout<<"min:"<<(afun)(4,5)<<endl;
return 0;
}
嘿嘿。。只是用起来 感觉怪怪滴。
接下来 我们可以再扩展一下下:
代码如下:
#include <tcharh>
#include <iostream>
#include <stdioh>
using namespace std;
class A
{
public:
int func1(int x,int y)
{
printf("A::func:x=%d,y=%d/n",x,y);
return (x<yx:y);
}
virtual int func2(int x,int y)
{
printf("A::func:x=%d,y=%d/n",x,y);
return (x>yx:y);
}
};
class B:public A
{
public:
virtual int func2(int x,int y)
{
printf("B::func:x=%d,y=%d/n",x,y);
return (x+y);
}
};
typedef int (A::p)(int,int);//指针名前一定要加上所属类型类名 A::的限定
typedef int (B::p0)(int,int);
int main()
{
A a; //因为成员函数地址的解引用必须要附驻与某个对象的地址,所以我们必须创建某个对象。
p fun=&A::func1;
cout<<(afun)(4,5)<<endl;
cout<<(bfun)(4,5)<<endl<<endl;
fun=&A::func2;
cout<<(afun)(4,5)<<endl;//请注意这里调用的是虚函数,嘿嘿 还真神奇 类成员函数指针也支持多态。
cout<<(bfun)(4,5)<<endl<<endl;
//fun=&B::func2; //这样式错误滴,因为不存在派生类的"指向类成员函数的指针"到基类的"指向类成员函数的指针"的隐式转换
fun=(int (A::)(int,int))&B::func2;//应该进行强制转换
cout<<(afun)(4,5)<<endl;
cout<<(bfun)(4,5)<<endl<<endl;
p0 fun0=&B::func2;
cout<<(afun)(4,5)<<endl;
cout<<(bfun)(4,5)<<endl<<endl;
fun0=&A::func2; //正确,因为这里进行了隐式转换
cout<<(afun)(4,5)<<endl;
cout<<(bfun)(4,5)<<endl<<endl;
//从上面我们不难发现 指向类成员函数的指针基类和派生类的关系和指向类对象的指针基类和派生类的关系完全相反,
//基类成员函数的布局被认为是派生类成员函数布局的一个子集
return 0;
}
接下 是有关模板类的类成员函数指针的使用
实例如下:
代码如下:
#include <tcharh>
#include <iostream>
#include <stdioh>
using namespace std;
class A
{
public:
int func(int x,int y)
{
printf("A::func : x=%d,y=%d/n",x,y);
return (x<yx:y);
}
};
class B
{
public:
int func(int x,int y)
{
printf("B::func : x=%d,y=%d/n",x,y);
return (x>yx:y);
}
};
template<class T>
class C
{
public:
T c;
void Print()
{
int (T::p)(int,int)=&T::func;
(cp)(4,5);
}
};
int main()
{
C<A> ca;
C<B> cb;
caPrint();
cbPrint();
return 0;
}
从上面 可以很清晰地看到。。其实它和普通的模板没有什么区别。。只不过将限定名称该为参数名酒OK啦。。。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)