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

💗个人主页💗
⭐个人专栏——C++学习⭐
💫点击关注🤩一起学习C语言💯💫

目录

1. 友元

1.1 友元函数

1.2 友元类

2. 内部类

2.1 成员内部类

2.2 局部内部类

3. 匿名对象


1. 友元

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

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

1.1 友元函数

友元函数可以访问类的私有成员和受保护成员,即使它们不是类的成员函数。

友元函数在类中声明为友元,可以在类外部定义,但是它们可以访问类的私有和受保护成员。

友元函数的声明方式为将函数声明在类的声明内部,但不是类的成员函数,并使用关键字"friend"来标识它。

在类的外部定义友元函数时,不需要使用类名限定,直接定义即可。

class MyClass 
{
private:int num;
public:MyClass(int n) : num(n) {}friend void printNum(const MyClass& obj);
};void printNum(const MyClass& obj) 
{cout << "Num: " << obj.num << endl;  // 可以访问类的私有成员num
}int main() 
{MyClass obj(10);printNum(obj);  // 调用友元函数return 0;
}

友元函数的使用场景包括:

  1. 当某个函数需要访问类的私有成员时,可以将该函数声明为类的友元函数。
  2. 当需要重载运算符时,可以将重载函数声明为类的友元函数。
  3. 当需要在类的各个对象之间进行相互操作或访问私有数据时,可以使用友元函数。

友元函数的一个重要限制是,在类的声明内部声明为友元函数的函数需要在类之外定义。因此,友元函数不能直接访问类的成员变量和成员函数,需要使用对象的引用或指针来访问。

1.2 友元类

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

  • 友元关系是单向的,不具有交换性。
  • 友元关系不能传递 如果C是B的友元, B是A的友元,则不能说明C时A的友元。
  • 友元关系不能继承,在继承位置再给大家详细介绍。
class ClassA 
{
private:int numA;
protected:int numB;
public:ClassA(int a, int b) : numA(a), numB(b) {}friend class ClassB;
};class ClassB 
{
public:void printNum(const ClassA& obj) {cout << "NumA: " << obj.numA << endl;  // 可以访问类A的私有成员numAcout << "NumB: " << obj.numB << endl;  // 可以访问类A的受保护成员numB}
};int main() 
{ClassA objA(10, 20);ClassB objB;objB.printNum(objA);  // 调用友元类的成员函数return 0;
}

友元类的使用场景包括:

  1. 当一个类需要访问另一个类的私有成员时,可以将该类声明为友元类。
  2. 当需要在类之间进行相互操作或访问私有数据时,可以使用友元类。

2. 内部类

概念:如果一个类定义在另一个类的内部,这个内部类就叫做内部类。内部类是一个独立的类, 它不属于外部类,更不能通过外部类的对象去访问内部类的成员。外部类对内部类没有任何优越 的访问权限。

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

内部类可以分为两种类型:成员内部类和局部内部类。

特性:

  1. 内部类可以定义在外部类的public、protected、private都是可以的。
  2. 注意内部类可以直接访问外部类中的static成员,不需要外部类的对象/类名。
  3. sizeof(外部类)=外部类,和内部类没有任何关系。

2.1 成员内部类

成员内部类是在外部类的内部定义的一个类,它可以访问外部类的所有成员,包括私有成员。

成员内部类的定义通常放在外部类的声明中,但是它的实现需要在外部类的作用域之外进行。

class OuterClass
{
private:int _x;static int y;
public:OuterClass(int x = 10):_x(x){}class InnerClass{public:void display(OuterClass obj){cout << "x = " << obj._x << endl;cout << "y = " << y << endl;}};
};int OuterClass::y = 0; // 静态成员变量初始化int main() {OuterClass obj1;OuterClass::InnerClass obj2;obj2.display(obj1);return 0;
}

2.2 局部内部类

局部内部类是在函数或代码块内定义的一个类,它只在该函数或代码块的作用域内可见。

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

void outerMethod() 
{class LocalClass {public:void display() {cout << "This is a local inner class" << endl;}};LocalClass obj;obj.display();
}int main() 
{outerMethod();return 0;
}

3. 匿名对象

匿名对象是指在创建对象时,没有为对象指定一个具体的名称,而是直接使用对象执行操作或调用方法。匿名对象在使用后就被销毁,无法再次引用。

class MyClass 
{
public:void display() {cout << "This is a MyClass object" << endl;}
};int main() 
{// 创建一个匿名对象并调用其display()方法MyClass().display();return 0;
}

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

红队学习笔记Day5 --->总结

今天先不讲新知识&#xff0c;来小小的复习一下 1.8888&#xff1f;隧道端口你怎么回事 在做隧道和端口转发的时候&#xff0c;我们常见的是通过一台跳板机&#xff0c;让外网的机器去远程连接到内网的一些机器&#xff0c;这时候就常见一些这样的命令 以防忘了&#xff0c;先…

Redis篇----第一篇

系列文章目录 文章目录 系列文章目录前言一、什么是 Redis?二、Redis 与其他 key-value 存储有什么不同?三、Redis 的数据类型?四、使用 Redis 有哪些好处?五、Redis 相比 Memcached 有哪些优势?前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住…

C++,stl,常用遍历查找算法

目录​​​​​​​ 1.常用遍历算法 for_each transform 2.常用查找算法 find find_if adjacent_find binary_search count count_if 1.常用遍历算法 for_each #include<bits/stdc.h> using namespace std;void print(int v) {cout << v << ; }…

Date类(Java)、SimpleDateFormat

一、Date Date代表的是日期和时间 import java.util.Date;public class Test {public static void main(String[] args) {//Date日期类的使用//1.创建一个Date对象&#xff1a;代表系统当前时间信息Date d new Date();System.out.println(d); //打印当前时间信息//2.拿到时间…

Spring AOP的实现方式

AOP基本概念 Spring框架的两大核心&#xff1a;IoC和AOP AOP&#xff1a;Aspect Oriented Programming&#xff08;面向切面编程&#xff09; AOP是一种思想&#xff0c;是对某一类事情的集中处理 面向切面编程&#xff1a;切面就是指某一类特定的问题&#xff0c;所以AOP可…

北邮复试刷题103. 二叉树的锯齿形层序遍历

103. 二叉树的锯齿形层序遍历 给你二叉树的根节点 root &#xff0c;返回其节点值的 锯齿形层序遍历 。&#xff08;即先从左往右&#xff0c;再从右往左进行下一层遍历&#xff0c;以此类推&#xff0c;层与层之间交替进行&#xff09;。 示例 1&#xff1a;输入&#xff1a…

如何量化多样性?答:辛普森多样性指数(Simpson’s Diversity Index)

如何量化多样性&#xff1f;答&#xff1a;辛普森多样性指数&#xff08;Simpson’s Diversity Index&#xff09; 生物多样性指地球上各种生命的多样性&#xff0c;涵盖所有生命形式&#xff0c;从基因、细菌到所有生态系统&#xff0c;例如森林或珊瑚礁生态系统。 那么如何…

【C++】:哈希和哈希桶

朋友们、伙计们&#xff0c;我们又见面了&#xff0c;本期来给大家解读一下有关哈希和哈希桶的知识点&#xff0c;如果看完之后对你有一定的启发&#xff0c;那么请留下你的三连&#xff0c;祝大家心想事成&#xff01; C 语 言 专 栏&#xff1a;C语言&#xff1a;从入门到精通…

相机图像质量研究(18)常见问题总结:CMOS期间对成像的影响--CFA

系列文章目录 相机图像质量研究(1)Camera成像流程介绍 相机图像质量研究(2)ISP专用平台调优介绍 相机图像质量研究(3)图像质量测试介绍 相机图像质量研究(4)常见问题总结&#xff1a;光学结构对成像的影响--焦距 相机图像质量研究(5)常见问题总结&#xff1a;光学结构对成…

Linux系统入门

目录 探索命令行 学习使用 man 寻找帮助 控制字符 统计代码行数 统计磁盘使用情况 在Linux下编写 Hello World 程序 使用重定向 使用Makefile管理工程 Unix哲学 探索命令行 Linux命令行中的命令使用格式都是相同的: 命令名称 参数1 参数2 参数3 ... 参数之间用任意…

.NET Core WebAPI中封装Swagger配置

一、创建相关文件 创建一个Utility/SwaggerExt文件夹&#xff0c;添加一个类 二、在Program中找到Swagger相关配置信息 三、添加方法&#xff0c;在Program中调用 在SwaggerExt类中添加方法&#xff0c;将相关配置添写入 /// <summary> /// swagger配置 /// </sum…

ORB-SLAM 三角化

特征点三角化(Triangulation)是是双目视觉中一个基础算法&#xff0c;也是VSLAM中一个非常基础的问题,它是根据特征点在多个相机下的投影恢复出特征点的3D坐标。 使用SVD求解方程组。