C++ 友元
目的:就是让一个函数或类,访问另一个类中的私有成员
友元的关键字:friend
友元的三种实现:
- 全局函数做友元
- 类做友元
- 成员函数做友元
全局函数做友元:
将全局函数的定义放入类中,前面加friend关键字
#include<iostream>
#include<string>
using namespace std;
class people
{
// people的友元函数,可以访问 people的私有成员
friend void work1(people &p);
public:
void fun()
{
p_name = "刘德华";
p_id = 123;
}
string p_name;
private:
int p_id;
};
void work1(people &p)
{
p.fun();
cout << "访问people的名字:" << p.p_name << endl;
cout << "访问people的id:" << p.p_id << endl;
}
int main()
{
people p;
work1(p);
return 0;
}
类做友元:
将类的定义放入类中,前面加friend关键字
一个类做另一个类的成员属性时,要用指针的形式定义
//类boyfriend访问类girlfriend的私有属性g_id。
#include<iostream>
#include<string>
using namespace std;
class girlfriend
{
//友元类boyfriend
//是boyfriend访问girlfriend的私有属性g_id,所以要放在girlfriend类内
friend class boyfriend;
public:
girlfriend();
string g_name;
private:
int g_id;
};
girlfriend::girlfriend()
{
g_name = "邓丽君";
g_id = 456;
}
class boyfriend
{
public:
boyfriend();
void visit();
string b_name;
girlfriend * g_friend;
private:
int b_id;
};
boyfriend::boyfriend()
{
g_friend = new girlfriend;
b_name = "刘德华";
b_id = 123;
}
void boyfriend::visit()
{
cout << "女朋友的名字是:" << g_friend->g_name << endl;
cout << "女朋友的ID是:" << g_friend->g_id << endl;
}
int main()
{
boyfriend b_friend;
b_friend.visit();
return 0;
}
成员函数做友元:
将类的成员函数定义放入类中,前面加friend关键字
一个类做另一个类的成员属性时,要用指针的形式定义
#include<iostream>
#include<string>
using namespace std;
class girl;
class boy
{
public:
boy();
void visit();
void visit1();
string b_name;
girl * gl;
};
class girl
{
friend void boy::visit();
public:
girl();
string g_name;
private:
int g_id;
};
girl::girl()
{
g_name = "李华";
g_id = 123;
}
boy::boy()
{
gl = new girl;
}
void boy::visit()
{
cout << "girl的名字:" << gl->g_name << endl;
cout << "girl的ID:" << gl->g_id << endl;
}
void boy::visit1()
{
cout << "girl的名字:" << gl->g_name << endl;
//cout << "girl的ID:" << gl->g_id << endl;
}
int main()
{
boy by;
by.visit();
return 0;
}
注意:在做成员函数友元时,类定义的先后顺序很重要,并且,类的成员函数要放到类外实现,仅在类内定义
例如本例:girl类中friend void boy::visit();,所以boy应该定义在girl类前面,不然友元时找不到定义的boy类以及visit()成员函数,但是,在boy类中定义了girl类作为boy类的成员属性,girl类又应该出现在boy类前面,这以问题可以用此方法解决,在boy类前面先说明girl类,然后在boy类后定义girl类,同时,要将boy类中涉及的girl类属性的成员函数定义在girl类的下方,不然,在编译时,报错显示“xx无定义”