C++的友元和内部类你了解吗

 更新时间:2022年01月24日 08:44:47   作者:Bitdancing  
这篇文章主要为大家介绍了C++的友元和内部类,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助

友元分为:友元函数 和 友元类

友元提供了一种突破封装的方式,有时提供了便利。但是友元会增加耦合度,破坏了封装,所以友元不宜多用。

友元函数

友元函数 可以 直接访问类的私有成员,它是定义在类外部的普通函数,不属于任何类,但需要在类的内部声明,声明时需要加 friend 关键字。

  • 友元函数可访问类的私有和保护成员,但不是类的成员函数
  • 友元函数不能用 const 修饰
  • 友元函数可以在类定义的任何地方声明,不受类访问限定符限制
  • 一个函数可以是多个类的友元函数
  • 友元函数的调用与普通函数的调用和原理相同

案例

friend ostream& operator<<(ostream& _cout, const Date& d);
friend istream& operator>>(istream& _cin, Date& d);

cout的输出流对象和隐含的this指针再抢占第一个参数的位置。 this 指针默认是第一个参数也就是左操作数。 但是实际使用中 cout 需要是第一个形参对象, 才能正常使用。

所以要将 operator<< 重载成全局函数。但是这样的话,又会导致类外没办法访问成员。所以这里就需要友元来解决。

友元类

友元类的所有成员函数都可以是另一个类的友元函数,都可以访问另一个类中的非公有成员。

  • 友元关系是单向的,不具有交换性
  • 友元关系不能传递

如果B是A的友元,C是B的友元,则不能说明C时A的友元。

class A;
class B;

class A {
	// 声明B类为A类的友元类,则在B类中就直接访问A类中的私有成员变量
	friend class B;
public:
	A (int a = 0)
		:_a(a)
	{}
private:
	int _a;
};

class B {
public:
	B(int b = 0)
		:_b(b)
	{}

	void SetA(int a)
	{
		// 直接访问A类私有的成员变量
		_aa._a = a;
	}
private:
	int _b;
	A _aa;
};

在这里插入图片描述

如果B不是A的友元类,报错。

内部类

如果一个类定义在另一个类的内部,这个内部类就叫做内部类。

此时这个内部类是一个独立的类,他不属于外部类,更不能通过外部类的对象去调用内部类。外部类对内部类没有任何优越的访问权限。

注:

内部类就是外部类的友元类。

内部类可以通过外部类的对象参数来访问外部类中的所有成员,但是外部类不是内部类的友元。

  • 内部类可以定义在 外部类的 publicprotectedprivate
  • 内部类可以直接访问外部类中的 static ,枚举成员,不需要外部类的对象或者类名
  • sizeof(外部类) = 外部类,和内部类没有关系
class A {
private:
	int _a;
	static int _k;

public:
	class B {
	public :
		void print(const A& aa)
		{
			cout << aa._a << endl;
			cout << _k << endl;
		}
	};

	A(int a = 10)
		:_a(a)
	{}
};

int A::_k = 0;

int main()
{
	A::B bb;
	bb.print(A());
	return 0;
}

输出:

10
0

总结

本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注脚本之家的更多内容!

相关文章

  • C++ 利用硬件加速矩阵乘法的实现

    C++ 利用硬件加速矩阵乘法的实现

    这篇文章主要介绍了C++ 利用硬件加速矩阵乘法的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-01-01
  • 利用Matlab复刻羊了个羊小游戏

    利用Matlab复刻羊了个羊小游戏

    最近羊了个羊游戏可谓是异常火爆,身边几乎都在玩,他其实就是一个简单的卡通背景消除闯关游戏,本文将用Matlab复刻这一游戏,感兴趣的可以了解一下
    2022-09-09
  • C++共享智能指针shared_ptr的实现

    C++共享智能指针shared_ptr的实现

    在C++中没有垃圾回收机制,必须自己释放分配的内存,否则就会造成内存泄露,解决这个问题最有效的方法是使用智能指针,本文主要介绍了C++共享智能指针shared_ptr的实现,感兴趣的可以了解一下
    2023-12-12
  • C语言之二叉树的遍历

    C语言之二叉树的遍历

    这篇文章主要介绍了C语言中二叉树的遍历:前序、中序、后序,认识二叉树结构最简单的方式就是遍历二叉树,感兴趣的小伙伴可以参考阅读本文
    2023-03-03
  • C/C++中退出线程的四种解决方法

    C/C++中退出线程的四种解决方法

    本篇文章是对C/C++中退出线程的四种解决方法进行了详细的分析介绍,需要的朋友参考下
    2013-05-05
  • 使用WindowsAPI实现播放PCM音频的方法

    使用WindowsAPI实现播放PCM音频的方法

    这篇文章主要介绍了使用WindowsAPI实现播放PCM音频的方法,很实用的一个功能,需要的朋友可以参考下
    2014-08-08
  • C语言实现opencv提取直线、轮廓及ROI实例详解

    C语言实现opencv提取直线、轮廓及ROI实例详解

    这篇文章主要介绍了C语言实现opencv提取直线、轮廓及ROI实例详解,具有一定借鉴价值,需要的朋友可以参考下
    2018-01-01
  • win32下进程间通信(共享内存)实例分析

    win32下进程间通信(共享内存)实例分析

    这篇文章主要介绍了win32下进程间通信(共享内存)实例分析,对win32应用程序及进程的原理做了较为深入的剖析,需要的朋友可以参考下
    2014-07-07
  • 详解C++ OpenCV实现图像拼接的原理及方法

    详解C++ OpenCV实现图像拼接的原理及方法

    本文以实现图像拼接为目标,把分割开的图像进行拼接还原,核心的内容包括:OpenCV图像拼接相关原理以及OpenCV图像拼接案例的实现,感兴趣的可以了解一下
    2022-07-07
  • C++缺省参数与重载函数(超详细!)

    C++缺省参数与重载函数(超详细!)

    无论使用什么语言函数都是代码段中必不可少的部分,因此我们有必要深入认识一下C++中函数的两种特殊用法,缺省参数,函数重载,这篇文章主要给大家介绍了关于C++缺省参数与重载函数的相关资料,需要的朋友可以参考下
    2024-06-06

最新评论