“再探构造函数”(2)

文章目录

  • 一. 友元
    • ‘全局函数’作友元
    • ‘成员函数’作友元
    • ‘类‘作友元
  • 二. 内部类
  • 三. 匿名对象
  • 四. 对象拷贝时的编译器优化
  • 分析调用时的顺序

一. 友元

何时会用到友元呢?

当想让(类外面的某个函数/其它的类)访问 某个类里面的(私有或保护的)内容时,可以选择使用友元。

友元提供了一种突破(类访问限定符 封装)的方式,即在类外面也可以访问类里面的私有/保护成员。

友元的关键字:friend

友元的声明通常位于类的声明中,但其实现则位于类外部。

  • 友元分为2种:友元函数和友元类
    在这里插入图片描述

友元函数是一种特殊的函数,且它的声明是在类的内部,但它并不是类的成员函数

还有一个注意点是,只有类的静态成员或者静态成员函数才能直接用类名去访问。

在这里插入图片描述

class A
{
public:A(int a1):_a1(3){}int _a1=1;
};
int main()
{//这个是错误的std::cout << A::_a1 << std::endl;//这个是正确的A aa1(9);std::cout << aa1._a1 << std::endl;
}

在这里插入图片描述

class A
{
public:A(int a2){}static int _a1;int _a2 = 9;
};static int _a1 = 8;//static成员在全局初始化int main()
{//静态成员函数可以用类名去访问std::cout << A::_a1 << std::endl;
}

‘全局函数’作友元

(某个全局函数) 想要访问 (类A里的私有成员),直接访问的话,编译器会报错。


办法:我们可以告诉编译器,这个全局函数是类A的好朋友,它是可以访问类A的私有成员的,可以放心,不会出事儿。


措施:在类的内部声明,全局函数是友元


//类A
class A
{friend void quanjv(A& a);public:A(int a1, int a2):_a1(a1), _a2(a2){}
private:int _a1;int _a2;
};
//全局函数
void quanjv(A& a)
{std::cout << a._a1 << std::endl;
}int main()
{A a1(1, 2);quanjv(a1);return 0;
}

‘成员函数’作友元

(B的成员函数)想要访问(A的私有成员)


在A中声明友元函数,告诉编译器,B的某个成员函数是A的友元函数,可以访问A的私有成员。


class A
{friend void B::fang();
public:A(int a1):_a1(3){}
private:int _a1=1;
};
class B
{
public:B(int b1):_b1(3){}void fang(){A a1(9);std::cout << a1._a1 << std::endl;}private:int _b1 = 1;
};int main()
{B b1(8);b1.fang();return 0;
}

‘类‘作友元

在A类中声明友元函数,告诉编译器,B类是A类的好朋友,可以访问A类的私有成员

class A
{//告诉编译器,类B是类A的好朋友,B可以使用A的私有,保护成员friend class B;
public:A(int a1):_a1(3){}
private:int _a1 = 1;
};
class B
{
public:B(int b1):_b1(3){}void fang(){A a1(9);std::cout << a1._a1 << std::endl;}private:int _b1 = 1;
};int main()
{B b1(8);b1.fang();return 0;
}

二. 内部类

我们可以将其理解为嵌套,即:一个类里面,嵌套了另一个类。(在里面的那个类,叫做内部类。)

class A
{public:class B{}
}

那什么时候考虑使用内部类呢?

如果说,类B的出现就是为了供类A使用,那么可以将类B设置为A的内部类。如果将B放在private/protected位置,那么B类就是A类的专属内部类,其他地方都用不了。

内部类的特点:

  1. 内部类的本质是:封装。
  2. 内部类是外部类的友元。
  3. 当计算外部类的大小sizeof时,内部类不计算在其中。
  4. 内部类是一个独立的类,它并不是外部类的成员。跟定义在全局的类相比,唯一不同的就是:内部类受外部类的类域限制and访问限定符限制

在这里插入图片描述

由图片可知,在计算A的大小时,B并不计算在内,说明B并不是A的成员。它们是两个独立的类。

还有一个需要注意的点:静态成员可以直接用类域访问A::_k,普通成员必须是对象名.成员的形式访问a._h

三. 匿名对象

在之前,我们定义一个对象的办法是:类型 对象名(参数);

class A
{
public:A(int a = 0):_a(a){cout << "A(int a)" << endl;}
private:int _a;
};
int main()
{A a1(9);  //A   a1   (9);//类型 对象名(参数)return 0;
}

现在有一种新的定义的方法:定义匿名对象 类型(参数); ,顾名思义即:匿名—>没有名字—>没有对象名

A(9);

匿名对象的特点:

  1. 生命周期短,仅存在于当行,到下一行就会调用它的析构函数。
  2. 调用一个类的成员函数时,会比较方便
class A
{
public:A(int a = 0):_a(a){cout << "A(int a)" << endl;}void fangwen(int q){cout << q << endl;}
private:int _a;
};
int main()
{//之前调用成员函数的办法A a1(9);a1.fangwen(8);//采用匿名对象的方式A(9).fangwen(8);return 0;
}
  1. 匿名对象也可以被引用。(需要注意的是:匿名对象和临时对象一样,具有常性,引用的时候需要+const。匿名对象的生命周期会被延长)
	const A& a1 = A();
  1. 当函数的参数是自定义类型,需要给缺省参数时,可以采用匿名对象。(缺省值一般都是’常量’和’全局变量’)

在这里插入图片描述

注意点:匿名对象不传参时,也要有括号,和之前的定义方法不同(之前的方法,不传参时不能加括号)

int main()
{//之前调用成员函数的办法//有参数A a1(9);  //正确//不传实参A a1;     //正确A a1();   //错误,这样就分不清到底是‘函数声明’还是’定义对象‘//采用匿名对象的方式A(9);A();   //不传参时,必须有括号return 0;
}

四. 对象拷贝时的编译器优化

什么是编译器优化呢?

为了尽可能提高程序的效率,在不影响正确性的情况下会尽可能减少一些传参和传参过程中可以省略的拷贝

  1. 拷贝+构造拷贝----->拷贝A a1=1;

语法上是比较复杂的:
在这里插入图片描述

实际只调用了“构造函数”

在这里插入图片描述

  1. 隐式类型(函数中):构造+拷贝构造------->直接构造func(1);
    在这里插入图片描述

  2. 匿名对象

一个表达式中,连续构造+拷贝构造---->优化为一个构造
在这里插入图片描述

分析调用时的顺序

在这里插入图片描述

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

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

相关文章

一周内从0到1开发一款 AR眼镜 相机应用?

目录 1. &#x1f4c2; 前言 2. &#x1f4a0; 任务拆分 2.1 产品需求拆分 2.2 开发工作拆分 3. &#x1f531; 开发实现 3.1 代码目录截图 3.2 app 模块 3.3 middleware 模块 3.4 portal 模块 4. ⚛️ 拍照与录像 4.1 前滑后滑统一处理 4.2 初始化 View 以及 Came…

Redis(2):内存模型

一、Redis内存统计 工欲善其事必先利其器&#xff0c;在说明Redis内存之前首先说明如何统计Redis使用内存的情况。 在客户端通过redis-cli连接服务器后&#xff08;后面如无特殊说明&#xff0c;客户端一律使用redis-cli&#xff09;&#xff0c;通过info命令可以查看内存使用情…

2024年CG作品网站推荐(精选篇)

ArtStation https://www.artstation.com GGAC https://www.ggac.com/

GraphRAG如何构建知识图谱Knowledge Graph

GraphRAG工作的第一步&#xff0c;是将输入的文档集合&#xff0c;按一定的策略拆分成一个一个chunks&#xff0c;然后解析每个chunks&#xff0c;将chunk中所关注的实体(entity)和关系(relation)解析出来&#xff0c;以此构建知识图谱。 那问题来了&#xff0c;GraphRAG是如何…

Spring Security 框架篇-深入了解 Spring Security 的认证功能流程和自定义实现登录接口(实现自定义认证过滤器、登出功能)

&#x1f525;博客主页&#xff1a; 【小扳_-CSDN博客】 ❤感谢大家点赞&#x1f44d;收藏⭐评论✍ 文章目录 1.0 Spring Security 框架概述 2.0 Spring Security 核心功能-认证功能 2.1 过滤器链 2.2 登录认证流程 2.3 思路分析 3.0 登录认证具体操作 3.1 环境搭建 3.2 实现 U…

JavaScript基础语法部分-黑马跟课笔记

一、Javascript介绍 1.JavaScript是什么&#xff1f; 1.是什么&#xff1f; 是一种运行在客户端&#xff08;浏览器&#xff09;的编程语言&#xff0c;实现人机交互效果 2.作用&#xff08;做什么&#xff1f;&#xff09; 网页特效&#xff08;监听用户的一些行为让网页做…

qt QDir详解

1、概述 QDir是Qt框架中的一个核心类&#xff0c;它提供了对文件系统目录的操作接口。Qt是一个跨平台的应用程序开发框架&#xff0c;广泛用于开发桌面、移动和嵌入式设备上的应用程序。QDir类使得开发者能够方便地在不同操作系统上处理目录和文件&#xff0c;如进行目录遍历、…

Jwt加解密

概述 记录jwt加解密的demo。 JSON Web Token (JWT) 是一种开放标准 (RFC 7519)&#xff0c;用于在网络应用环境间安全地传输信息。JWT 通常用于身份验证和信息交换&#xff0c;因为它可以被签名和加密&#xff0c;确保数据的完整性和隐私性。 JWT 的基本结构 JWT 由三部分组…

鸥柏(OBOO)户外触摸广告屏科技创新 高速服务区收费站案例

鸥柏&#xff0c;作为户外液晶显示技术的品牌高端领先者&#xff0c;其新产品鸥柏户外触摸屏在高速服务区收费站入口处得到了真实且广泛的应用。OBOO鸥柏户外广告机能够存储和展示海量信息&#xff0c;包括新闻、政策、天气预报、实时路况等&#xff0c;为过往司乘人员提供丰富…

ASED6015SH-ASEMI中低压MOS管ASED6015SH

ASED6015SH-ASEMI中低压MOS管ASED6015SH 型号&#xff1a;ASED6015SH 品牌&#xff1a;ASEMI 导通内阻&#xff1a;90mΩ 启动电压&#xff1a;2V-4V 最大漏源电流&#xff08;Id&#xff09;&#xff1a;19A 漏源击穿电压&#xff08;VRM&#xff09;&#xff1a;150V …

`掌握Python-PPTX,让PPt制作变得轻而易举!`

文章目录 掌握Python-PPTX&#xff0c;让PPT制作变得轻而易举&#xff01;背景介绍python-pptx 是什么&#xff1f;如何安装 python-pptx&#xff1f;简单库函数使用方法应用场景常见Bug及解决方案总结 掌握Python-PPTX&#xff0c;让PPT制作变得轻而易举&#xff01; 背景介绍…

linux的用户账号与权限管理

一、用户账号 root 和zhang 表示当前的登录用户test1 表示当前的主机名/home&#xff1a; 表示当前所在的目录为/home~&#xff1a; 表示当前所在的目录为~#&#xff1a; 表示当前用户是管理员$&#xff1a; 表示当前用户是普通用户 1.切换用户 su - 用户名 &#xff08;完全切…

Qt项目实战:银行利息(贷款)计算器

目录 一.ui设计 二.初始化表单 三. 存款计算 四.贷款计算 五.效果 六.代码 1.h 2.cpp 一.ui设计 二.初始化表单 获取当前时间&#xff0c;并将开始日期设置为当前日期&#xff0c;将结束日期设置为当前日期加一年 三. 存款计算 1.从文本框获取当前资金、利率、定期期…

无人机高山景区物资吊运技术及前景分析

随着科技的飞速发展&#xff0c;无人机技术已经逐渐渗透到各个领域&#xff0c;并在其中展现出巨大的潜力和应用前景。在高山景区物资运输方面&#xff0c;无人机技术的引入不仅解决了传统运输方式中人力成本高、效率低下的问题&#xff0c;还极大地提升了运输的安全性和灵活性…

就是这个样的粗爆,手搓一个计算器:数线计算器

作为程序员&#xff0c;没有合适的工具&#xff0c;就得手搓一个&#xff0c;PC端&#xff0c;移动端均可适用。废话不多说&#xff0c;直接上代码。 HTML: <div class"calculator"><div class"input-group"><label for"a">…

NSET or MSET算法--原理解析

1.背景 NSET/MSET是一种非线性的多元预测诊断技术&#xff0c;广泛应用于系统状态估计、故障诊断和预测等领域&#xff1b;相比于传统的线性模型和方法&#xff0c;NSET/MSET能够更好地处理非线性系统&#xff0c;并提供更准确的预测和诊断能力。在早期&#xff0c;MSET融合了…

NAS端最强音乐库,多平台服务支持。海康存储部署『Navidrome』

NAS端最强音乐库&#xff0c;多平台服务支持。海康存储部署『Navidrome』 哈喽小伙伴们好&#xff0c;我是Stark-C~ 对于我们NAS用户&#xff0c;我们总是喜欢将自己喜欢的音乐资源通过下载的方式保存在本地&#xff0c;不过海康存储目前对因音乐的支持和管理实在过于薄弱&am…

Vue2+3

Day1 创建Vue实例 准备容器 引包 —— 开发版本 创建Vue实例 —— new Vue() 指定配置项 el 和 data > 渲染数据 el指定挂载点&#xff0c;指定控制的是哪个盒子 data提供数据 <!DOCTYPE html> <html lang"en"> <head><meta charset&qu…

AWTK-HarmonyOS NEXT 发布

AWTK 全称为 Toolkit AnyWhere&#xff0c;是 ZLG 倾心打造的一套基于 C 语言开发的 GUI 框架。旨在为用户提供一个功能强大、高效可靠、简单易用、可轻松做出炫酷效果的 GUI 引擎&#xff0c;支持跨平台同步开发&#xff0c;一次编程&#xff0c;到处编译&#xff0c;跨平台使…

新闻稿件管理:SpringBoot框架实战指南

3系统分析 3.1可行性分析 通过对本新闻稿件管理系统实行的目的初步调查和分析&#xff0c;提出可行性方案并对其一一进行论证。我们在这里主要从技术可行性、经济可行性、操作可行性等方面进行分析。 3.1.1技术可行性 本新闻稿件管理系统采用SSM框架&#xff0c;JAVA作为开发语…