C++友元函数举例说明

1、什么是友元函数?


  有时候我们需要用一个普通的函数直接的调用类A的成员变量,或者类B的成员函数需要直接调用类A的成员变量,来实现数据的共享。这个时候,为了减少系统的开销,提高程序执行的效率,我们就需要使用“友元函数”的概率。即“友元”的目的是为了方便实现数据的共享。它的优点是:使得程序简洁、直观、高效,缺点是:破坏了类的封装性。因此,只有在迫不得已的情况下为了简化程序设计才使用友元。

2、友元函数分类:

  友元函数大体上可以分为三类:1)普通函数最为类的友元函数使用;2)友元类:类B的所有成员函数都是类A的友元;3)类B的成员函数作为类A的友元函数。

3、举例说明:

1)普通函数最为类的友元函数使用:在类Test的定义中声明普通函数disp()为其友元函数,那么函数disp()就可以使用类Test的成员变量。具体代码实现如下:


 1 #include <iostream>
2
3 using namespace std;
4
5 class Test{
6 public:
7 Test()
8 {
9 a = 1;
10 b = 2;
11 }
12 friend void disp(Test v);
13 private:
14 int a;
15 int b;
16 };
17
18 void disp(Test v)
19 {
20 cout<<v.a<<" "<<v.b<<endl;
21 }
22
23
24 void main()
25 {
26 Test v;
27 disp(v);
28 }

2)友元类:类B的所有成员函数都是类A的友元,提供了两个类共享同一数据的手段。具体演示代码如下:


 1 #include <iostream>
2
3 using namespace std;
4
5 class TestB;
6 class TestA{
7 public:
8 TestA()
9 {
10 a = 1;
11 b = 2;
12 }
13 private:
14 int a;
15 int b;
16 friend TestB;
17 };
18
19 class TestB{
20 public:
21 void disp(TestA a)
22 {
23 cout<<a.a<<" "<<a.b<<endl;
24 }
25 };
26
27
28
29 void main()
30 {
31 TestB b_demo;
32 TestA a_demo;
33 b_demo.disp(a_demo);
34 }

3)类B的成员函数作为类A的友元函数。具体演示代码如下:


 1 #include <iostream>
2
3 using namespace std;
4
5 class TestA;
6
7 class TestB{
8 public:
9 void disp(TestA a);
10 };
11
12 class TestA{
13 public:
14 TestA()
15 {
16 a = 1;
17 b = 2;
18 }
19 friend void TestB::disp(TestA a);
20 private:
21 int a;
22 int b;
23
24 };
25
26 void TestB::disp(TestA a)
27 {
28 cout<<a.a<<" "<<a.b<<endl;
29 }
30
31 void main()
32 {
33 TestB b_demo;
34 TestA a_demo;
35 b_demo.disp(a_demo);
36 }

C++友元函数举例说明,布布扣,bubuko.com

时间: 2024-08-23 07:14:34

C++友元函数举例说明的相关文章

【C/C++】友元函数

为什么要使用友元函数? 在实现类之间数据共享时,减少系统开销,提高效率 如果类A中的函数要访问类B中的成员(例如:智能指针类的实现),那么类A中该函数要是类B的友元函数 为了使其他类的成员函数直接访问该类的私有变量.即:允许外面的类或函数去访问类的私有变量和保护变量,从而使两个类共享同一函数.此时可使用友元类 友元函数是全局函数还是类的成员函数 友元函数既可以是全局函数也可以是某个类的成员函数 哪些情况下使用友元函数 运算符重载的某些场合需要使用友元(因为运算符要访问类中的成员变量) 两个类要共

友元函数和友元类声明举例

注: 友元是一种定义在类外部的普通函数或类,但它需要在类体内进行说明,为了与该类的成员函数加以区别,在说明时前面加以关键字friend.友元不是成员函数,但是它可以访问类中的私有成员.所以,友元声明只能出现在类定义中.因为友元不是授权类的成员,所以它不受其所在类的声明区域public private 和protected 的影响.即友元函数的声明可以出现在类的任何地方 class A { friend class A_friend_class; friend void A_friend_func

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

C++ Primer 学习笔记_26_操作符重载与转换(1)--可重载/不可重载的操作符、成员函数方式重载、友元函数方式重载

C++ Primer 学习笔记_26_操作符重载与转换(1)--可重载/不可重载的操作符.成员函数方式重载.友元函数方式重载 引言: 明智地使用操作符重载可以使类类型的使用像内置类型一样直观! 一.重载的操作符名 像任何其他函数一样,操作符重载函数有一个返回值和一个形参表.形参表必须具有操作符数目相同的形参.比如赋值时二元运算,所以该操作符函数有两个参数:第一个形参对应着左操作数,第二个形参对应右操作数. 大多数操作符可以定义为成员函数或非成员函数.当操作符为成员函数时,它的第一个操作数隐式绑定

初探C++运算符重载学习笔记&amp;lt;2&amp;gt; 重载为友元函数

初探C++运算符重载学习笔记 在上面那篇博客中,写了将运算符重载为普通函数或类的成员函数这两种情况. 以下的两种情况发生.则我们须要将运算符重载为类的友元函数 <1>成员函数不能满足要求 <2>普通函数又不能訪问类的私有成员时 举例说明: class Complex{ double real, imag; public: Complex(double r, double i):real(r), imag(i){ }; Complex operator+(double r); };

C++运算符重载为友元函数学习笔记

初探C++运算符重载学习笔记 在上面那篇博客中,写了将运算符重载为普通函数或类的成员函数这两种情况. 下面的两种情况发生,则我们需要将运算符重载为类的友元函数 <1>成员函数不能满足要求 <2>普通函数又不能访问类的私有成员时 举例说明: class Complex{ double real, imag; public: Complex(double r, double i):real(r), imag(i){ }; Complex operator+(double r); };

C++ 友元函数总结

1.为什么要引入友元函数:在实现类之间数据共享时,减少系统开销,提高效率 具体来说:为了使其他类的成员函数直接访问该类的私有变量 即:允许外面的类或函数去访问类的私有变量和保护变量,从而使两个类共享同一函数 优点:能够提高效率,表达简单.清晰 缺点:友元函数破环了封装机制,尽量不使用成员函数,除非不得已的情况下才使用友元函数. 2.什么时候使用友元函数: 1)运算符重载的某些场合需要使用友元. 2)两个类要共享数据的时候 3.怎么使用友元函数: 友元函数的参数: 因为友元函数没有this指针,则

C++友元函数

1. 1 #include <iostream> 2 using namespace std; 3 4 class Time{ 5 friend void func(Time &t); // 声明全局函数为一个友元函数 6 public: 7 Time(int h, int m, int s) : i_mHour(h), i_mMin(m), i_mSecon(s) { } // 构造函数 8 private: 9 int i_mHour; 10 int i_mMin; 11 int

模板类的约束模板友元函数:template friend functions

本来这篇博客是不打算写的,内容不是很难,对于我自己来讲,更多的是为了突出细节. 所谓template friend functions,就是使友元函数本身成为模板.基本步骤:1,在类定义的前面声明每个模板函数.eg:template <typename T> void counts(); template <typename T> void report<>(T &);2,在类声明中再次将模板声明为友元. template <typename TT>