首页 > 代码库 > c++ 中的友元函数的普通用法
c++ 中的友元函数的普通用法
C++中友元函数的调用,一般分为三种方式:
1、一般的友元函数
2、类A作为类B的友元类,则类A的成员函数都是类B的友元函数。
3、一个类的成员函数作为另外一个类的友元函数
//分为友元函数的例子
类A 作为测试的类,类B 是类A的友元类。
class A
{
public:
A()
{
a = 100;
b = 10;
}
friend class B; //这儿公私均可,常常用到的是变为私有变量,类B是类A的友元类。友元的第二种方式,需要带class
int getA()
{
return a;
}
void printAB()
{
cout<<"a"<<a<<" b"<<b<<endl;
}
friend void setA(A *p, int _a); //友元函数的定义,friend 放在前面,记得友元函数的是将friend 放在函数的前面 ,友元函数的第一种方式
protected:
private:
int a;
int b;
static int module;
};
int A::module = 10;
class B
{
public:
void setA(A *p, int _a);
void displayA(A *p)
{
cout<<p->a<<"ddddd"<<endl;
}
protected:
private:
};
//友元类的类的成员函数都是友元函数 第二种方式
void B:: setA( A *p, int _a)
{
p->a = _a + 100;
p->b = _a + 100;
}
//普通的友元函数 第一种方式的具体实现
void setA(A *p, int _a)
{
p->a = _a;
p->b = _a;
}
用类girl 和类boy来举例,既有boy 作为girl的友元类,又有boy的成员函数是girl的友元函数,这两种形式。
class girl;
class boy
{
public:
void display_girl(girl &x); //普通成员的函数的定义没有改变
//{
// cout<<"girl-name"<<x.name<<"age"<<x.age<<endl;
//}
};
class girl
{
public: //当初这个没有写pulic 导致出现错误
girl()
{
name = NULL;
name = new char[10];
if( NULL !=name)
{
strcpy(name,"fal");
}
age = 26;
}
~girl()
{
if( NULL != name){
//free(name);
delete [] name;
}
}
private:
char *name;
int age;
//friend class boy; //当初写代码的时候没有写class, 这是一个错误 ,友元的第二这种方式
friend void boy::display_girl(girl &x); //允许某一个类的成员函数访问 第3种方式
};
友元函数的具体实现过程:
void boy::display_girl(girl &x)
{
cout<<"girl-name:"<<x.name<<"\t age:"<<x.age<<endl;
}
主函数,
int main(void)
{
A testa;
B testB;
girl fal;
boy zjl;
zjl.display_girl(fal);
testB.setA(&testa, 10);
cout<<"aa"<<testa.getA()<<endl;
setA(&testa, 6);
cout<<"bb"<<testa.getA()<<endl;
return 0;
}
备注:learnCpluseplus/FunctionAndReload/dm03_friendly.cpp
c++ 中的友元函数的普通用法