友元函数
发表于:2024-12-11 | 分类: C++
字数统计: 658 | 阅读时长: 3分钟 | 阅读量:

友元函数和友元类

本类中使用

  • 友元函数可以访问当前类中的所有成员,包括 public、protected、private 属性的。
  • 声明:类内部friend关键字
  • 定义:普通全局函数

注意定义时无类型:::成员,而成员函数和静态成员函数都要。

  • 和静态成员函数类似,友元函数也没有this,我们要实现修改类成员,需要传递当前对象(指针或引用)
  • 它相当于全局函数,直接调用即可
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
#include <iostream>
using namespace std;

class Student
{
public:
Student(char *name, int age, float score);

public:
// 将show()声明为友元函数
friend void show(Student *pstu);

private:
char *m_name;
int m_age;
float m_score;
};

Student::Student(char *name, int age, float score)
{
m_name = name;
m_age = age;
m_score = score;
}

// 定义,无需friend和类名归属
void show(Student *pstu)
{
cout << pstu->m_name << "的年龄是 " << pstu->m_age << ",成绩是 " << pstu->m_score << endl;
}

int main()
{
Student stu("小明", 15, 90.6);
// 调用友元函数(直接调用)
show(&stu);

return 0;
}

其他类中

  • friend 函数不仅可以是全局函数(非成员函数),还可以是另外一个类的成员函数
  • show函数
    • Student中作为成员函数,并且show属于Student类
      • 成员函数可以访问类的所有成员
    • Address中作为友元函数
      • 可以访问Address中 的私有属性,所有show函数的参数应该包含Address的指针(引用)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
#include <iostream>
using namespace std;

class Address; // 提前声明Address类,因为Student类中使用了Address类

// 声明Student类
class Student
{
public:
Student(char *name, int age, float score);

public:
void show(Address *addr);

private:
char *m_name;
int m_age;
float m_score;
};

// 声明Address类
class Address
{
protected:
char *m_province; // 省份
private:
char *m_city; // 城市
char *m_district; // 区(市区)
public:
Address(char *province, char *city, char *district);
friend void Student::show(Address *addr);
};

// 实现Student类
Student::Student(char *name, int age, float score)
{
m_name = name;
m_age = age;
m_score = score;
}

// show是成员函数,指定类归属
void Student::show(Address *addr)
{
cout << m_name << "的年龄是 " << m_age << ",成绩是 " << m_score << endl;
// 访问了属于Address类的私有的、保护的成员变量(地址信息)
cout << "家庭住址:" << addr->m_province << "省" << addr->m_city << "市" << addr->m_district << "区" << endl;
}

// 实现Address类
Address::Address(char *province, char *city, char *district)
{
m_province = province;
m_city = city;
m_district = district;
}

int main()
{
Student stu("小明", 16, 95.5f);
Address addr("陕西", "西安", "雁塔");
// 是成员函数(对象调用),不是友元函数(直接调用)
stu.show(&addr);

return 0;
}
上一篇:
C++继承
下一篇:
字符串