0%

C++ - 友元

最近在学习 C++,所以顺便将每日所学记录下来,一方面为了巩固学习的知识,另一方面也为同样在学习C++的童鞋们提供一份参考。

友元

C++是从结构化的C语言发展而来的,需要照顾结构化设计程序员的习惯,所以在对私有成员可访问范围的问题上不可限制太死。于是就有了友元(friend)的概念,这相当于是说:朋友是值得信任的,所以可以对他们公开一些自己的隐私。

友元函数

把一些函数(包括全局函数和其他类的成员函数)声明为“友元”,这样那些函数就成为该类的友元函数,在友元函数内部就可以访问该类对象的私有成员了。

  • 全局函数声明为友元的格式:friend 返回值类型 函数名(参数表);
  • 其他类的成员函数声明为友元的格式:friend 返回值类型 其他类的类名::成员函数名(参数表);–(注:不能把其他类的私有成员函数声明为友元)
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
#include <iostream>
using namespace std;

class Test
{
public:
Test();
~Test();
int GetA();

friend void SetA(Test *,int); //声明友元函数
private:
int a;
int b;
};

Test::Test()
{
a = 100;
b = 200;
}

Test::~Test()
{
}

int Test::GetA()
{
return this->a;
}

void SetA(Test *t1, int a)
{
t1->a = a;
}


int main()
{
Test t1;
cout << t1.GetA() << endl;
SetA(&t1, 20); //通过友元函数来修改类外部不可访问的变量
cout << t1.GetA() << endl;
system("pause");
return 0;

}

友元类

友元类的所有成员函数都是另一个类的友元函数,都可以访问另一个类中的隐藏信息(包括私有成员和保护成员)。

当希望一个类可以存取另一个类的私有成员时,可以将该类声明为另一类的友元类。定义友元类的语句格式如下:
friend class 类名;

其中:friend和class是关键字,类名必须是程序中的一个已定义过的类。

  • 友元关系不能被继承。
  • 友元关系是单向的,不具有交换性。若类B是类A的友元,类A不一定是类B的友元,要看在类中是否有相应的声明。
  • 友元关系不具有传递性。若类B是类A的友元,类C是B的友元,类C不一定是类A的友元,同样要看类中是否有相应的申明
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
#include <iostream>
using namespace std;


class A
{
public:
A();
~A();
void DisPlay();
friend class B; //友元类定义

private:
int x;
};

A::A()
{
}

A::~A()
{
}

void A::DisPlay()
{
cout << x << endl;
}

class B
{
public:
B();
~B();
int SetA(int a)
{
Aobj.x = a;
return Aobj.x;
}

int GetA()
{
cout << Aobj.x << endl;
return Aobj.x;
}
private:
A Aobj; //友元类
};

B::B()
{
}

B::~B()
{
}
int main()
{
B b1;
b1.SetA(100);
b1.GetA();
system("pause");

}