C++深入探究友元使用

 更新时间:2022年07月01日 10:39:34   作者:编程小程  
采用类的机制后实现了数据的隐藏与封装,类的数据成员一般定义为私有成员,成员函数一般定义为公有的,依此提供类与外界间的通信接口。但是,有时需要定义一些函数,这些函数不是类的一部分,但又需要频繁地访问类的数据成员,这时可以将这些函数定义为该类的友元函数

友元

友元 friend 机制允许一个类授权其他的函数访问它的非公有成员.

友元声明以关键字 friend 开头 ,它只能出现在类的声明中, 它们不受其在类体中的 public private 和
protected 区的影响.

友元分为外部函数友元, 成员函数友元,类友元。

特点

不具有对称性:A 是 B 的友元, 并不意味着 B 是A的友元

不具有传递性:A是B的友元, B是C的友元, 但A不是C的友元。

不具有继承性: Base 类型继承 Object类型, 如果Object 类型是A的友元,但Base类型不是A友元。

外部函数友元

示例

需要在类中进行对其进行声明,则可以访问类的所有成员

class Int
{
int value;
public:
Int(int x = 0):value(x)
{
cout<<"Create Int: "<<this<<endl;
}
~Int(){ cout<<"Destroy Int: "<<this<<endl;}
friend void Print(const Int &it); // 注册为类的友元函数
};
void Print(const Int &it)
{
cout<<it.value<<endl;
}
int main()
{
Int a(10);
Print(a);
return 0;
}

成员函数友元

将一个成员函数声明成友元的时,必须要指明该成员函数属于哪个类:

class Object; // 类的声明
class Int
{
friend void Object::Print(const Int &it); // 注册为成员函数友元
private:
int value;
public:
Int(int x = 0):value(x){ cout<<"Create Int: "<<this<<endl;}
~Int(){ cout<<"Destroy Int: "<<this<<endl;}
};
class Object
{
public:
void Print(const Int &it)
{
cout<<it.value<<endl;
}
};
int main()
{
Int a(10);
Object obj;
obj.Print(a);
return 0;
}

总结

1.友元函数不是类的成员函数,在函数体中访问对象的成员,必须用对象名加运算符“.”加对象成员名。但友元函数可以访问类中的所有成员,一般函数只能访问类中的公有成员。

2.友元函数不受类中的访问权限关键字限制,可以把它放在类的公有、私有、保护部分,但结果一样。

3.某类的友元函数的作用域并非该类作用域。如果该友元函数是另一类的成员函数,则其作用域为另一类的作用域,否则与一般函数相同。

类友元

整个类可以是另一个类的友元。友元类的每个成员函数都是另一个类的友元函数,都可访问另一个

类中的所以成员,共有,保护或私有数据成员

class Object; // 类的声明
class Int
{
friend class Object; // 注册为类友元
private:
int value;
public:
Int(int x = 0):value(x){ cout<<"Create Int: "<<this<<endl;}
~Int(){ cout<<"Destroy Int: "<<this<<endl;}
};
class Object
{
public:
void Print(const Int &it)
{
cout<<it.value<<endl;
}
};
int main()
{
Int a(10);
Object obj;
obj.Print(a);
return 0;
}

到此这篇关于C++深入探究友元使用的文章就介绍到这了,更多相关C++友元内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • OpenGL实现中点划线法

    OpenGL实现中点划线法

    这篇文章主要为大家详细介绍了OpenGL实现中点划线法,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-02-02
  • C语言实现二叉树遍历的迭代算法

    C语言实现二叉树遍历的迭代算法

    这篇文章主要介绍了C语言实现二叉树遍历的迭代算法,包括二叉树的中序遍历、先序遍历及后序遍历等,是非常经典的算法,需要的朋友可以参考下
    2014-09-09
  • C语言实题讲解快速掌握单链表上

    C语言实题讲解快速掌握单链表上

    单链表是后面要学的双链表以及循环链表的基础,要想继续深入了解数据结构以及C语言,我们就要奠定好这块基石!接下来就和我一起学习吧
    2022-04-04
  • C++野指针和悬空指针的实现方法

    C++野指针和悬空指针的实现方法

    野指针和悬空指针是指针中常见的两个概念,本文详细的介绍了这两种的使用,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-08-08
  • C语言数组实现打砖块游戏

    C语言数组实现打砖块游戏

    这篇文章主要为大家详细介绍了C语言数组实现打砖块游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-05-05
  • 详解C语言之缓冲区溢出

    详解C语言之缓冲区溢出

    缓冲区是一块连续的计算机内存区域,可保存相同数据类型的多个实例。缓冲区可以是堆栈、堆和静态数据区。在C/C++语言中,通常使用字符数组和malloc/new实现缓冲区。溢出指数据被添加到分配给该缓冲区的内存块之外。缓冲区溢出是最常见的程序缺陷
    2021-06-06
  • C++超细致讲解队列queue的使用

    C++超细致讲解队列queue的使用

    队列先进先出,即只能在容器的末尾添加新元素,只能从头部移除元素,下面这篇文章主要给大家介绍了关于C++中队列queue用法的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考下
    2022-05-05
  • 利用C++实现通讯录管理系统的完整代码

    利用C++实现通讯录管理系统的完整代码

    通讯录是一个可以记录亲人、好友信息的工具,下面这篇文章主要给大家介绍了关于利用C++实现通讯录管理系统的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2022-06-06
  • C++ RAII在HotSpot VM中的重要应用解析

    C++ RAII在HotSpot VM中的重要应用解析

    RAII技术被认为是C++中管理资源的最佳方法,进一步引申,使用RAII技术也可以实现安全、简洁的状态管理,编写出优雅的异常安全的代码,这篇文章主要介绍了C++ RAII在HotSpot VM中的重要应用,需要的朋友可以参考下
    2023-09-09
  • 通过示例详解C++智能指针

    通过示例详解C++智能指针

    这篇文章主要为大家通过示例介绍了C++智能指针的使用,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-03-03

最新评论