【C++】类和对象(五)友元、内部类、匿名对象

news2024/11/26 11:51:22

前言:前面我们说到类和对象是一个十分漫长的荆棘地,今天我们将走到终点,也就是说我们对于C++算是正式的入门了。

💖 博主CSDN主页:卫卫卫的个人主页 💞
👉 专栏分类:高质量C++学习 👈
💯代码仓库:卫卫周大胖的学习日记💫
💪关注博主和博主一起学习!一起努力!
在这里插入图片描述


目录标题

  • 类和对象
    • 友元
    • 内部类
      • 通过外部类使用内部类
      • 内部类是外部类的友元
      • 外部类无法直接访问内部类的成员
    • 匿名对象


类和对象

友元

友元是 C++ 中的一个特殊声明,允许一个类或函数访问另一个类的私有成员或受保护成员。友元的声明可以在类中出现,也可以在类外出现。

  • 友元关系是单向的,不具有交换性。
  • 友元关系不能传递如果C是B的友元, B是A的友元,则不能说明C时A的友元。
  • 友元关系不能继承,在继承位置再给大家详细介绍。

友元函数: 友元函数是在类外部声明的函数,它可以直接访问类的私有成员或受保护成员。在类中声明一个函数为友元函数,需要使用 friend 关键字。
友元类: 友元类是在一个类中声明的另一个类,被声明为友元类的类可以访问该类的私有成员或受保护成员。在类中声明一个类为友元类,需要使用 friend 关键字

class A {
private:
    int x;
public:
    friend class B; // 声明类 B 是类 A 的友元
    friend void func(); // 声明函数 func 是类 A 的友元
    A(int n = 10)
    {
        x = n;
    }
};

class B {
public:
    void printA(A obj) {
        cout <<"友元类访问私有成员:" << obj.x << endl; // 类 B 可以访问类 A 的私有成员 x
    }
};

void func() {
    A obj(1);
    cout <<"func函数访问的私有成员: " << obj.x << endl; // 函数 func 可以访问类 A 的私有成员 x
}

int main()
{
    A obj(5);
    func();//友元函数可以访问类中的私有成员
    B obj1;
    obj1.printA(obj);//类 B 可以访问类 A 的私有成员 x
    return 0;
}

在这里插入图片描述
友元关系是单向的,即如果类 A 是类 B 的友元,不代表类 B 是类 A 的友元,需要分别进行声明。

注意,过度使用友元会破坏封装性,并增加代码的复杂性和耦合性,因此在使用友元时应慎重考虑。


内部类

概念:如果一个类定义在另一个类的内部,这个内部类就叫做内部类。内部类是一个独立的类,它不属于外部类,更不能通过外部类的对象去访问内部类的成员。外部类对内部类没有任何优越的访问权限。
注意:内部类就是外部类的友元类,参见友元类的定义,内部类可以通过外部类的对象参数来访问外部类中的所有成员。但是外部类不是内部类的友元。

通过外部类使用内部类

在下面的示例中,Inner是一个内部类,Outer是一个外部类.
实例演示:

class Outer
{
public :
	Outer(int s = 1, int q = 1)
		:m(s)
		,n(q)
	{
	}
	void Print()
	{
		cout << "你好我是外部类 : " << m << " " << n << endl;

	}
	class Inner
	{
	public:
		Inner(int n = 1, int m = 1)
			:x(n)
			,y(m)
		{
		}
		void Print()
		{
			cout << "你好我是内部类 : " << x << " " << y << endl;
		}
	private :
		int x;
		int y;
	};
private :
	int m;
	int n;
};

int main()
{
	Outer outobj(9, 22);
	Outer::Inner inobj(10,20);//外部使用内部类
	inobj.Print();
	outobj.Print();
	return 0;
}

在这里插入图片描述


内部类是外部类的友元

实例演示
在这里插入图片描述

外部类无法直接访问内部类的成员

实例演示:
在这里插入图片描述


总结
C++中的内部类指的是在一个类的内部定义的类。内部类具有以下特点:

  1. 内部类是一个嵌套在外部类中的类,它们之间可以互相访问彼此的成员。

  2. 内部类可以访问外部类的所有成员,包括私有成员。

  3. 内部类的对象可以在外部类的成员函数中直接创建。

  4. 内部类的作用域被限定在外部类中,外部类的成员函数可以访问内部类,但外部类的对象不能直接访问内部类。

  5. 内部类可以使用外部类的成员作为自己的成员,从而实现更灵活的设计和封装。

  6. 内部类可以被声明为私有,这样只有外部类的成员函数可以访问它。

  7. 内部类的声明可以在外部类的定义之外,但定义必须在外部类的定义之内。

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


匿名对象

C++中的匿名对象是指没有被命名的对象,它们在创建后可以直接使用,但无法通过变量名来引用。匿名对象通常用于简单的一次性操作或者作为函数的参数。
匿名对象的特点如下

  1. 匿名对象在创建后立即执行相关操作,并在表达式结束后被销毁
  2. 匿名对象无法被引用,因此无法在其他地方被使用。
  3. 匿名对象适用于一些临时的、不需要保留状态的操作,如简单的计算或调用函数。
    实例演示1
class Myclass
{
public:
    Myclass(int year = 2024, int month = 1, int day = 1)
        :_year(year)
        ,_month(month)
        ,_day(day)
    {
    }
    void Print()
    {
        cout << "year: " << _year << " month: " << _month << " day: " << _day << endl;
    }
private:
    int _year;
    int _month;
    int _day;
};
int main()
{
    Myclass(2024, 2, 16).Print();//调用匿名对象
    Myclass A = 2023;//这里会产生隐式转换
    A.Print();
    Myclass B;调用一次构造函数
    B.Print();
    B = Myclass(2003, 9, 22);//此处等价于赋值,且这个匿名对象会调用一次给构造函数
    B.Print();
	return 0;
}

在这里插入图片描述


匿名对象在以下情况下会调用拷贝构造、默认构造和析构函数

如果生成的匿名对象在外部有对象等待被其实例化,此匿名对象的生命周期就变成了外部对象的生命周期;如果生成的匿名对象在外面没有对象等待被其实例化,此匿名对象将会生成之后,立马被析构。
好啦,今天的内容就到这里啦,下期内容预告类和对象(五)友元、内部类、匿名对象等,下期就会对类和对象进行最后的收尾了,各位加油呐!


好啦,今天的内容就到这里啦,下期内容预告C/C++内存管理,类和对象就在这里和大家告一段落了,各位加油呐!


结语:今天的内容就到这里吧,谢谢各位的观看,如果有讲的不好的地方也请各位多多指出,作者每一条评论都会读的,谢谢各位。


🌏🗺️ 这里祝各位新年快乐 💞💞

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1451217.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C++入门篇(5)——类和对象(2)

目录 1.类的6个默认成员函数 2.构造函数 2.2 概念 2.3 特性 3.析构函数 3.1 概念 3.2 特性 1.类的6个默认成员函数 如果一个类一个成员都没有&#xff0c;那么这个类就是空类。但空类并非什么都没有&#xff0c;编译器会对任何一个类都生成六个默认成员函数。 2.构造…

安装 Windows Server 2003

1.镜像安装 镜像安装:Windows Server 2003 2.安装过程(直接以图的形式呈现) 按Enter(继续),继续后F8继续 直接Enter安装 下一步 秘钥:GM34K-RCRKY-CRY4R-TMCMW-DMDHM 等待安装成功即可

FreeRTOS 延迟中断处理

采用二值信号量同步 二值信号量可以在某个特殊的中断发生时&#xff0c;让任务解除阻塞&#xff0c;相当于让任务与中断 同步。这样就可以让中断事件处理量大的工作在同步任务中完成&#xff0c;中断服务例程(ISR) 中只是快速处理少部份工作。如此&#xff0c;中断处理可以说是…

实现MainActivity转到其他界面的功能实现

#安卓 实现MainActivity转到其他界面的功能实现 实现步骤&#xff1a; 1.添加两个界面及&#xff1b;layout&#xff0c;分别为fullsreen和dialog 2.mainifest中注册两个antivity 3.向Mainactivity中代码。用intent简单的跳转 package com.example.myapplication;import an…

《数电》理论笔记-第3章-常用组合逻辑电路及MSI组合电路模块的应用

一&#xff0c;编码器和译码器 1&#xff0c;编码器 编码:用由0和1组成的代码表示不同的事物。 编码器:实现编码功能的电路&#xff0c; 常见编码器:普通编码器、优先编码器、二进制编码器二-十进制编码器等等 1.1 三位二进制普通编码器和三位二进制优先编码器 1分58秒开始 …

第五节 zookeeper集群与分布式锁_2

1.分布式锁概述 1.1 什么是分布式锁 1&#xff09;要介绍分布式锁&#xff0c;首先要提到与分布式锁相对应的是线程锁。 线程锁&#xff1a;主要用来给方法、代码块加锁。当某个方法或代码使用锁&#xff0c;在同一时刻仅有一个线程执行该方法或该代码段。 线程锁只在同一J…

Swift Combine 级联多个 UI 更新,包括网络请求 从入门到精通十六

Combine 系列 Swift Combine 从入门到精通一Swift Combine 发布者订阅者操作者 从入门到精通二Swift Combine 管道 从入门到精通三Swift Combine 发布者publisher的生命周期 从入门到精通四Swift Combine 操作符operations和Subjects发布者的生命周期 从入门到精通五Swift Com…

【算法设计与分析】搜索旋转排序数组

&#x1f4dd;个人主页&#xff1a;五敷有你 &#x1f525;系列专栏&#xff1a;算法分析与设计 ⛺️稳中求进&#xff0c;晒太阳 题目 整数数组 nums 按升序排列&#xff0c;数组中的值 互不相同 。 在传递给函数之前&#xff0c;nums 在预先未知的某个下标 k&#xff…

【C++】 为什么多继承子类重写的父类的虚函数地址不同?『 多态调用汇编剖析』

&#x1f440;樊梓慕&#xff1a;个人主页 &#x1f3a5;个人专栏&#xff1a;《C语言》《数据结构》《蓝桥杯试题》《LeetCode刷题笔记》《实训项目》《C》《Linux》《算法》 &#x1f31d;每一个不曾起舞的日子&#xff0c;都是对生命的辜负 前言 本篇文章主要是为了解答有…

MATLAB计算极限和微积分

一.函数与极限 计算极限&#xff1a;lim(3*x^2/(2x1))&#xff0c;x分别趋于0和1&#xff0c;代码如下&#xff1a; syms x; limit(3*x*x/(2*x1),x,0) limit(3*x*x/(2*x1),x,1) 结果分别为0和1&#xff1a; 1.计算双侧极限 计算极限&#xff1a;lim(3*x^2/(2x1))&#xff0…

哈希表哈希桶(C++实现)

哈希的概念 顺序结构以及平衡树中&#xff0c;元素关键码与其存储位置之间没有对应的关系&#xff0c;因此在查找一个元素 时&#xff0c;必须要经过关键码的多次比较。顺序查找时间复杂度为O(N)&#xff0c;平衡树中为树的高度&#xff0c;即 O( l o g 2 N log_2 N log2​N)&…

JavaScript Let 块级作用域

JavaScript Let 学习手记 最近在学习 JavaScript ES6 (2015) 标准时&#xff0c;我发现了let这个关键字&#xff0c;它为声明变量提供了一种新的方式&#xff0c;而且这种方式具有块级作用域的特点&#xff0c;真的很有趣呢&#xff01; 理解块作用域 在 ES6 之前的版本中&a…

【html学习笔记】2.基本元素

1.标题 标题会自动粗体其中大写的内容&#xff0c;并带有换行的效果会使用<h1>到<h6>表示不同大小的标题 <h1>标题1</h1> <h2>标题2</h2> <h3>标题3</h3> <h4>标题4</h4> <h5>标题5</h5> <h6>…

【Web】从零开始的js逆向学习笔记(上)

目录 一、逆向基础 1.1 语法基础 1.2 作用域 1.3 窗口对象属性 1.4 事件 二、浏览器控制台 2.1 Network Network-Headers Network-Header-General Network-Header-Response Headers Network-Header-Request Headers 2.2 Sources 2.3 Application 2.4 Console 三、…

基于3种机器学习法的黄土高原农业干旱监测比较研究_王晓燕_2022

基于3种机器学习法的黄土高原农业干旱监测比较研究_王晓燕_2022 摘要关键词1 引言2 研究区与数据6 结论#pic_center =x260) 摘要 本文集成 MODIS、TRMM、GLDAS 和再分析等多源数据,选取了 13 个与干旱有关的变量,并与基于气象数据的 3 个月时间尺度的标准化降水蒸发指数(SP…

算法沉淀——优先级队列(堆)(leetcode真题剖析)

算法沉淀——优先级队列 01.最后一块石头的重量02.数据流中的第 K 大元素03.前K个高频单词04.数据流的中位数 优先队列&#xff08;Priority Queue&#xff09;是一种抽象数据类型&#xff0c;它类似于队列&#xff08;Queue&#xff09;&#xff0c;但是每个元素都有一个关联的…

【精品】关于枚举的高级用法

枚举父接口 public interface BaseEnum {Integer getCode();String getLabel();/*** 根据值获取枚举** param code* param clazz* return*/static <E extends Enum<E> & BaseEnum> E getEnumByCode(Integer code, Class<E> clazz) {Objects.requireNonN…

C#,二分法(Bisection Method)求解方程的算法与源代码

1 二分法 二分法是一种分治算法&#xff0c;是一种数学思维。 对于区间[a&#xff0c;b]上连续不断且f&#xff08;a&#xff09;f&#xff08;b&#xff09;<0的函数yf&#xff08;x&#xff09;&#xff0c;通过不断地把函数f&#xff08;x&#xff09;的零点所在的区间…

OpenCV Mat 实例详解 二

构造函数 OpenCV Mat实例详解一中已介绍了部分OpenCV Mat构造函数&#xff0c;下面继续介绍剩余部分构造函数。 Mat (const std::vector< _Tp > &vec, bool copyDatafalse)&#xff1b; vec 包含数据的vec对象 copyData 是否拷贝数据&#xff0c;true— 拷贝数据&…

蓝桥杯真题:纸张尺寸

import java.util.Scanner; // 1:无需package // 2: 类名必须Main, 不可修改public class Main {public static void main(String[] args) {Scanner scan new Scanner(System.in);//在此输入您的代码...String s scan.nextLine();char[] c s.toCharArray();char c1 c[1];in…