iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >C++的友元和内部类你了解吗
  • 242
分享到

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

2024-04-02 19:04:59 242人浏览 安东尼
摘要

目录友元函数案例友元类内部类总结友元分为:友元函数 和 友元类 友元提供了一种突破封装的方式,有时提供了便利。但是友元会增加耦合度,破坏了封装,所以友元不宜多用。

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

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

友元函数

友元函数 可以 直接访问类的私有成员,它是定义在类外部的普通函数,不属于任何类,但需要在类的内部声明,声明时需要加 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

总结

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

--结束END--

本文标题: C++的友元和内部类你了解吗

本文链接: https://www.lsjlt.com/news/163489.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • C++的友元和内部类你了解吗
    目录友元函数案例友元类内部类总结友元分为:友元函数 和 友元类 友元提供了一种突破封装的方式,有时提供了便利。但是友元会增加耦合度,破坏了封装,所以友元不宜多用。...
    99+
    2022-11-13
  • C++的对象特性和友元你真的了解吗
    目录对象特征构造函数和析构函数函数的分类以及调用拷贝构造函数调用时机 构造函数调用规则深拷贝与浅拷贝初始化列表类对象作为类变量静态成员成员变量和成员函数分开储存this指针...
    99+
    2022-11-13
  • C++超详细讲解友元与内部类
    目录一.友元1.友元函数(1)引入原因(2)友元函数作用(3)友元函数特征2.友元类(1)解释(2)友元类特征二.内部类(不常用)1.概念2.特性 一.友元 友元分为: 友...
    99+
    2022-11-13
  • Java中的内部类你了解吗
    目录成员内部类1.定义2.成员内部类的使用规则 3.成员内部类对象的创建:4.内部类与静态域静态内部类:1.定义:2.静态内部类的使用规则:3.静态内部类对象的创建&nbs...
    99+
    2022-11-13
  • C++的内联函数你了解吗
    目录1.概念2.函数演示3.函数特性总结1.概念 以inline修饰的函数叫做内联函数,编译时C++编译器会在调用内联函数的地方展开,没有函数压栈的开销,内联函数提升程序运行的效率。...
    99+
    2022-11-13
  • C++类与对象深入之静态成员与友元及内部类详解
    目录一:静态成员1.1:静态成员分类1.2:静态成员变量1.3:静态成员函数1.4:总结特性1.5:试题示例1.6:C++11成员初始化新玩法二:友元2.1:全局函数做友元2.2:类...
    99+
    2022-11-13
  • PHP数组的内部实现你了解吗
    目录前言探究zvalzend_array结构介绍结构体数组插入操作hash函数总结前言 这几天在翻github的时候, 碰巧看到了php的源码, 就 down 下来随便翻了翻&nbs...
    99+
    2022-11-13
  • C++的数据类型你真的了解吗
    目录前言1 整型2 sizeof关键字3 实型(浮点型)4 字符型5 转义字符6 字符串型7 布尔类型 bool8 数据的输入总结前言 C++不像python,创建变量的时候必须指定...
    99+
    2022-11-13
  • C++的类型转换(强转)你了解吗
    目录静态类型转换动态类型转换常量转换重新解释转换总结静态类型转换 关键字: static_cast 1,允许内置数据类型之间的转换 char a = 'a'; d...
    99+
    2022-11-13
  • C++中类的转换函数你了解吗
    只有接受一个参数(其他参数有默认值的也算)的构造函数才能作为转换构造函数。 在C++中,接受一个参数的构造函数为将类型与该参数相同的值转换为类提供了蓝图。因此,下面的构造函数用于将d...
    99+
    2022-11-13
  • C++字符串类的封装你真的了解吗
    目录字符串类的封装常规代码头文件函数实现文件Test文件重载左移>>重载右移<<重载赋值=重载中括号[ ]重载加号+重载==总结字符串类的封装 常规代码 头文...
    99+
    2022-11-13
  • C++的动态内存管理你真的了解吗
    目录前言用法上对内置类型对自定义类型new/delete底层原理重载类的专属operator new和 operator delete定位newnew/delete与malloc/f...
    99+
    2022-11-13
  • C++的继承和派生你了解吗
    目录继承的写法继承实质与权限问题 ​总结继承的写法 //父类 基类 class parent { }; //子类 派生类 //公有继承 class soon1:public pare...
    99+
    2022-11-13
  • TypeScript中的函数和类你了解吗
    目录函数作为参数定义函数函数参数的类型可选类型参数默认值剩余参数this的默认推导函数重载类初始化继承多态成员修饰符总结函数 以下声明了一个函数类型,通过type来定义类型别名,vo...
    99+
    2022-11-13
  • C#基于Socket的网络通信类你了解吗
    目录摘要代码总结摘要 之所以要进行Socket套接字通信库封装,主要是直接使用套接字进行网络通信编程相对复杂,特别对于初学者而言。实际上微软从.net 2.0开始已经提供了TCP、U...
    99+
    2022-11-13
  • C语言的动态内存管理你了解吗
    目录C/C++内存分配方式C++内存管理方式new和delete的使用new和delete的骚操作new和delete的区别重载new和delete定位new表达式内存泄露总结C/C...
    99+
    2022-11-13
  • JavaSE的类和对象你真的了解吗
    目录1.基本概念1.1面向对象1.2类和对象2.类的定义及使用2.1定义2.2类的实例化3.this引用3.1访问成员变量3.2访问成员方法3.3this引用的特性4.构造方法4.1...
    99+
    2022-11-13
  • Java中的抽象类和接口你了解吗
    目录抽象类什么是抽象类?抽象类属于什么类型?抽象类怎么定义?抽象类是干什么的?什么是抽象方法?非抽象类继承抽象类抽象类总结接口接口的基础语法接口的实现接口和多态联合使用继承和实现同时...
    99+
    2022-11-13
  • C++简单又轻松的讲解类和对象中友元函数
    目录友元浅解概念友元目的友元的三种实现全局函数做友元类做友元成员函数做友元注意事项总结友元 用到关键字 friend 浅解概念 举一个非常实际的例子,假如端午节到了你煮了两种粽子,一...
    99+
    2022-11-13
  • C++的多态和虚函数你真的了解吗
    目录一、C++的面试常考点二、阿里真题2.1 真题一(1)虚函数表vtbl(2)构造一个派生类对象的过程(3)析构一个派生类对象的过程2.2 真题二2.3 真题三2.4 真题四2.5...
    99+
    2022-11-13
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作