C++超详细讲解友元与内部类

目录
  • 一.友元
    • 1.友元函数
      • (1)引入原因
      • (2)友元函数作用
      • (3)友元函数特征
    • 2.友元类
      • (1)解释
      • (2)友元类特征
  • 二.内部类(不常用)
    • 1.概念
    • 2.特性

一.友元

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

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

1.友元函数

(1)引入原因

operator<<:因为cout 的 输出流对象和隐含的 this 指针在抢占第一个参数的位置 。 this 指针默认是第一个参数也就是左操数了。但是实际使用中cout 需要是第一个形参对象,才能正常使用。所以我们要将 operator<< 重载成全局函数。但是这样的话,又会导致类外没办法访问成员,那么这里就需要友元来解决。operator>> 同理。

(2)友元函数作用

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

#include<iostream>
using namespace std;
class Date
{
	// 友元函数
	friend ostream& operator<<(ostream& out, const Date& d);
public:
private:
	int _year;
	int _month;
	int _day;
};
ostream& operator<<(ostream& out, const Date& d)
{
	out << d._year << "/" << d._month << "/" << d._day << endl;
	return out;
}
int main()
{
	Date d;
	//d << cout;
	cout << d;
	return 0;
}

(3)友元函数特征

【1】友元函数 可访问类的私有和保护成员,但 不是类的成员函数

【2】友元函数 不能用 const 修饰(因为没有this指针)

【3】友元函数 可以在类定义的任何地方声明, 不受类访问限定符限制,放在public,private中都行,不放这两个里面放在最前面也行,一般都是定义最前面的

【4】一个函数可以是多个类的友元函数

【5】友元函数的调用与普通函数的调用和原理相同

2.友元类

(1)解释

class Date; // 前置声明:因为编译器是向上查找,在Time类中
class Time
{
    //友元类
	friend class Date;
声明日期类为时间类的友元类,则在日期类中就可以直接访问Time类中的私有成员变量
public:
	Time(int hour=0, int minute=0, int second = 0)
		: _hour(hour)
		, _minute(minute)
		, _second(second)
	{}
private:
	int _hour;
	int _minute;
	int _second;
};
class Date
{
public:
	Date(int year = 1900, int month = 1, int day = 1)
		: _year(year)
		, _month(month)
		, _day(day)
	{}
	void SetTimeOfDate(int hour, int minute, int second)
	{
		// 直接访问时间类私有的成员变量
		_t._hour = hour;
		_t._minute = minute;
		_t._second = second;
	}
private:
	int _year;
	int _month;
	int _day;
	Time _t;
};

在Date类中有一自定义成员变量Time _t;,成员函数 SetTimeOfDate 想访问 _t 对象的成员变量,因为类Time中的成员变量是私有的,所以正常情况无法访问,则需要借助友元类:

想在Date类中访问Time类对象的私有成员变量,就需要在类Time中声明日期类为时间类的友元类,则在日期类中就可以直接访问Time类中的私有成员变量。

格式:friend class Date;

(在Date类中访问Time类对象的成员变量:在Time类中写日期类声明并在前面加friend)

(2)友元类特征

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

【2】友元关系是单向的,不具有交换性。 比如上述Time类和Date类,在Time类中声明Date类为其友元类,那么可以在Date类中直接访问Time类的私有成员变量,但想在Time类中访问Date类中私有的成员变量则不行。

【3】友元关系不能传递 如果B是A的友元,C是B的友元,则不能说明C时A的友元。

二.内部类(不常用)

1.概念

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

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

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

2.特性

1. 内部类可以定义在外部类的 public 、 protected 、 private 都是可以的。

2. 注意内部类可以直接访问外部类中的 static 、枚举成员,不需要外部类的对象 / 类名。

3. sizeof( 外部类 )= 外部类,和内部类没有任何关系

举例:B是A的内部类,B是A的友元,A不是B的友元,A的大小是4字节,类A的大小不包含静态变量k(存在静态区)和成员函数(存在公共代码段)和内部类B,类A的大小仅仅只有h,所以是4字节。

class A {
private:
	static int k;
	int h;
public:
	class B    //内部类
	{
	public:
		void foo(const A& a)
		{
			cout << k << endl;    //B可以直接访问A内部成员变量
			cout << a.h << endl;    //B可以直接访问A内部成员变量
		}
	};
};
int main()
{
	cout << sizeof(A) << endl;
    A aa;
    A::B bb;    //定义B的对象时,需要指定是A的类域 A::
	return 0;
}

到此这篇关于C++超详细讲解友元与内部类的文章就介绍到这了,更多相关C++友元与内部类内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • C++类与对象深入之静态成员与友元及内部类详解

    目录 一:静态成员 1.1:静态成员分类 1.2:静态成员变量 1.3:静态成员函数 1.4:总结特性 1.5:试题示例 1.6:C++11成员初始化新玩法 二:友元 2.1:全局函数做友元 2.2:类做友元 2.3:成员函数做友元 三:内部类 3.1:概念 3.2:特性 一:静态成员 静态成员就是在成员变量和成员函数前加上关键字static,称为静态成员.C++里面尽量用静态成员变量代替全局变量. 1.1:静态成员分类 1️静态成员变量: 所有对象共享同一份数据 在编译阶段分配内存 类内声明,

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

    目录 友元函数 案例 友元类 内部类 总结 友元分为:友元函数 和 友元类 友元提供了一种突破封装的方式,有时提供了便利.但是友元会增加耦合度,破坏了封装,所以友元不宜多用. 友元函数 友元函数 可以 直接访问类的私有成员,它是定义在类外部的普通函数,不属于任何类,但需要在类的内部声明,声明时需要加 friend 关键字. 友元函数可访问类的私有和保护成员,但不是类的成员函数 友元函数不能用 const 修饰 友元函数可以在类定义的任何地方声明,不受类访问限定符限制 一个函数可以是多个类的友元函

  • C++超详细讲解友元与内部类

    目录 一.友元 1.友元函数 (1)引入原因 (2)友元函数作用 (3)友元函数特征 2.友元类 (1)解释 (2)友元类特征 二.内部类(不常用) 1.概念 2.特性 一.友元 友元分为: 友元函数 和 友元类 友元提供了一种突破封装的方式,有时提供了便利.但是友元会增加耦合度,破坏了封装,所以友元不宜多用. 1.友元函数 (1)引入原因 operator<<:因为cout 的 输出流对象和隐含的 this 指针在抢占第一个参数的位置 . this 指针默认是第一个参数也就是左操数了.但是实

  • C++超详细讲解友元的使用

    目录 一.友元的概念 二.友元的用法 三.友元的语法 四.友元的尴尬 五.注意事项 六.小结 一.友元的概念 什么是友元? 友元是 C++ 中的一种关系 友元关系发生在函数与类之间或者类与类之间 友元关系是单项的,不能传递 二.友元的用法 在类中以 friend 关键字声明友元 类的友元可以是其它类或者具体函数 友元不是类的一部分 友元不受类中访问级别的限制 友元可以直接访问具体类的所有成员 三.友元的语法 在类中用 friend 关键字对函数或类进行声明 先看一个不使用友元的代码: #incl

  • java反射超详细讲解

    目录 Java反射超详解✌ 1.反射基础 1.1Class类 1.2类加载 2.反射的使用 2.1Class对象的获取 2.2Constructor类及其用法 2.4Method类及其用法 Java反射超详解✌ 1.反射基础 Java反射机制是在程序的运行过程中,对于任何一个类,都能够知道它的所有属性和方法:对于任意一个对象,都能够知道它的任意属性和方法,这种动态获取信息以及动态调用对象方法的功能称为Java语言的反射机制. Java反射机制主要提供以下这几个功能: 在运行时判断任意一个对象所属

  • Java超详细讲解三大特性之一的多态

    目录 多态性 instanceof 关键字的使用 ==和equals()区别 object类中toString()的使用 static关键字的使用 总结 多态性 1理解多态性:可以理解为一个事物的多种形态. 2何为多态性:对象的多态性:父类的引用指向子类的对象(或子类的对象赋给父类的引用) 3多态的使用:虚拟方法调用,有了对象的多态性以后,我们在编译期,只能调用父类中声明的方法,但在运行期,我们实际执行的是子类重写父类的方法,多态性的使用前提:类的继承关系,方法的重写,总结:编译,看左边,运行,

  • C++超详细讲解操作符的重载

    目录 一.需要解决的问题 二.操作符重载 三.小结 一.需要解决的问题 下面的复数解决方案是否可行? 下面看一下复数的加法操作: #include <stdio.h> class Complex { int a; int b; public: Complex(int a = 0, int b = 0) { this->a = a; this->b = b; } int getA() { return a; } int getB() { return b; } friend Comp

  • C++超详细讲解运算符重载

    目录 概念 赋值运算符重载 const成员 取地址及const取地址操作符重载 概念 C++为了增强代码的可读性引入了运算符重载,运算符重载是具有特殊函数名的函数,也具有其返回值类 型,函数名字以及参数列表,其返回值类型与参数列表与普通的函数类似. 函数名字为:关键字operator后面接需要重载的运算符符号. 函数原型:返回值类型 operator操作符(参数列表) 需要注意的几点: 不能通过连接其他符号来创建新的操作符:比如operator@,必须是已有的操作符: 重载操作符必须有一个类类型

  • Spring Boot超详细讲解请求处理流程机制

    目录 1. 背景 2. Spring Boot 的请求处理流程设计 3. Servlet服务模式请求流程分析 3.1 ServletWebServerApplicationContext分析 3.2 Servlet服务模式之请求流程具体分析 4. Reactive服务模式请求流程分析 4.1 ReactiveWebServerApplicationContext分析 4.2 webflux服务模式之请求流程具体分析 5. 总结 1. 背景 之前我们对Spring Boot做了研究讲解,我们知道怎

  • C++ Boost Archive超详细讲解

    目录 一.说明 二.关于Archive库 一.说明 对Boost.Serialization库的应用,存在如下内容: Archive Pointers and References Serialization of Class Hierarchy Objects Wrapper Functions for Optimization Boost.Serialization 库可以将 C++ 程序中的对象转换为可以保存和加载以恢复对象的字节序列.有不同的数据格式可用于定义生成字节序列的规则. Boo

  • 超详细讲解Linux C++多线程同步的方式

    目录 一.互斥锁 1.互斥锁的初始化 2.互斥锁的相关属性及分类 3,测试加锁函数 二.条件变量 1.条件变量的相关函数 1)初始化的销毁读写锁 2)以写的方式获取锁,以读的方式获取锁,释放读写锁 四.信号量 1)信号量初始化 2)信号量值的加减 3)对信号量进行清理 背景问题:在特定的应用场景下,多线程不进行同步会造成什么问题? 通过多线程模拟多窗口售票为例: #include <iostream> #include<pthread.h> #include<stdio.h&

  • 超详细讲解Linux DHCP服务

    目录 一.DHCP服务(动态主机配置协议) 1.背景 2.概述 3.优点 4.DHCP报文类型 5.DHCP 的分配方式 二.安装 DHCP 服务器 1.DHCP 服务软件 2.主配置文件 三.配置步骤 1.使用 DHCP 动态的给 PC 机分配 IP 地址 ① eNSP ②虚拟机 ③验证 ④进入命令行"ipconfig"测试 一.DHCP服务(动态主机配置协议) 1.背景 1.手动设置工作量大且容易冲突 2.用DHCP可以减少工作量和避免地址冲突 2.概述 作用:为局域网内的电脑分配

随机推荐