【C++】类与对象全面剖析(尾卷)(构造深化、类型转换、static成员特性及内部类与匿名对象)

【C++】类与对象全面剖析(尾卷)(构造深化、类型转换、static成员特性及内部类与匿名对象)
在这里插入图片描述


文章目录

一、再探构造函数

在之前的文章中我们大致将构造函数讲完了,但是还有一个比较重要的知识点当时没有讲到,因为如果把这部分内容加上去,会让前面的内容难度变得非常高,所以这部分内容放到这里来讲,之前讲构造函数的文章是:【C++】揭秘类与对象的内在机制(核心卷之构造函数与析构函数的奥秘)
接下来进入今天的正题,我们今天要补充的内容就是构造函数中的“初始化列表”,它可以帮我们对成员变量进行初始化,我们还是先来看看它的语法格式(刚开始学可能看起来怪怪的,熟悉了就好了),如下:
classDate{ public://不使用初始化列表Date(int year =2025,int month =1,int day =1){  _year = year; _month = month; _day = day;}//使用初始化列表Date(int year =2025,int month =1,int day =1):_year(year)//在花括号(函数体)前以冒号为开始,_month(month)//从第二行开始用英文逗号分隔,_day(day){ }//在花括号中(函数体中)可以正常执行其它代码,这里就不演示了private:int _year;int _month;int _day;};
在上面的代码中,有两个构造函数,一个不使用初始化列表和一个使用了初始化列表,在这里它们的作用都是一样的,就是根据用户传来的年月日对当前对象进行初始化
那么既然上面的代码中,无论是否使用了初始化列表,两个构造函数的作用都相同,而且这个初始化列表还这么丑,它到底有什么不同之处呢?接下来我们就正式介绍初始化列表
初始化列表非常重要,有3类成员变量必须使用初始化列表进行初始化,如果不使用初始化列表就会报错,它们分别是cosnt成员变量、引用成员变量以及自定义类型成员变量,那么为什么这3类成员变量就必须使用初始化列表进行初始化呢?
其中cosnt成员变量以及引用成员变量比较特殊,它们都只能初始化一次,如果我们将其写在构造函数内部进行初始化会有一定的歧义,比如const成员变量只能初始化一次,往后这个成员变量的值就不能修改了,如果它在函数体出现两次,该选择哪个值作为它的结果
而引用对象也是,只能初始化一次,往后只能修改引用对象的值,而不能修改引用对象的指向,如果在构造函数函数体中出现了两次,最终该选择哪个变量作为它的引用对象呢?我们来看如下伪代码:
classA{ public://构造A(int& a,int& b){ //如果写在函数体内,编译器最终应该选择a还是选择4这个值 _a = a; _a =4;//_b又应该是谁的引用?会产生歧义 _b = b; _b = a;}private:constint _a;int& _b;};
所以针对这两类比较特殊的成员变量,C++就设计了初始化列表,供这种只能初始化一次的成员变量进行初始化,如果使用上面的方式进行初始化编译器就会直接报错,所以初始化列表确保了初始化的唯一性,如下:
classA{ public:A(int& a,int& b):_a(a),_b(b){ }private:constint _a;int& _b;};
这就是为什么const成员变量和引用成员变量必须使用初始化列表进行初始化的原因,那么为什么自定义类型也要使用初始化列表进行初始化呢?其实跟上面两个的原因差不多,我们慢慢来分析,首先在有默认构造的情况下,编译器会自动调用这个自定义类型的默认构造,如下:
classB{ public:B(int b =10){  _b = b;}private: Date _d;int _b;};intmain(){  B b;return0;}
在这个例子中,类B中既有内置类型,又有自定义类型,B中只对内置类型作了处理,编译器也不会报错,因为编译器默认会去调用这个自定义类型的默认构造对这个自定义类型的成员变量作初始化,我们调试来看看:

Read more

从零开始搭建Tare的Java 开发环境

从0开始一步一步讲解如何在Trae 中构建Java开发环境,供大家学习交流。 1. java 项目plugin安装:Extension Pack for Java 拓展包包含以下内容,亦可手动安装; 2. 开发环境配置 Maven for java 拓展配置 与 Language Support for Java(TM) by Red Hat 中的 maven 需要分别单独配置;否则易出现 maven 拓展 与 Java Projects 所引用的 maven settings配置不相同的情况; 3. lombok 项目中有使用lombok时 可安装lombok插件: 并在项目的 settings.json 中增加:“lombok.configPath”: “lombok.

By Ne0inhk
基于飞算JavaAI的在线图书借阅平台设计与实现(深度实践版)

基于飞算JavaAI的在线图书借阅平台设计与实现(深度实践版)

摘要: 本文以从概念到落地,完整构建一个“在线图书借阅平台”的全过程。文章不仅覆盖了环境配置、需求分析、接口设计、数据库建模等基础流程,更着重于展示AI自动生成的项目核心代码,并在此基础上进行了详尽的功能扩展和代码优化。通过对用户管理、图书管理、借阅与归还等关键业务模块的详细代码实现与注释,本文旨在全面、深入地展现飞算JavaAI在真实项目开发中的强大能力,探讨其如何重塑传统Java开发范式,显著提升开发效率与代码质量。 一、引言 在软件工程领域,随着业务逻辑的日益复杂化和市场对产品迭代速度的严苛要求,传统的纯手动编码模式正面临前所未有的挑战。开发周期长、人力成本高、代码质量参差不齐、技术债累积等问题,成为制约项目成功的重要因素。正是在这样的背景下,人工智能辅助编程(AI-Assisted Programming)应运而生,它通过将大型语言模型与软件工程知识深度融合,旨在自动化处理开发流程中的重复性、模式化任务,使开发者能够聚焦于更具创造性的核心业务逻辑。 飞算科技推出的飞算JavaAI,正是这一变革浪潮中的杰出代表。它作为一款深度集成于IntelliJ IDEA的智能插件,能够

By Ne0inhk
Kubernetes与开发语言:重新定义.NET Core与Java的云原生未来

Kubernetes与开发语言:重新定义.NET Core与Java的云原生未来

文章目录 * 一、 历史交汇:不同的起点,相同的云原生归宿 * 二、 部署与运行:在K8s中的不同生存哲学与实践 * 三、 配置、监控与可观测性:生态工具链的碰撞 * 四、 微服务架构:框架与平台的竞合 * 五、 总结:殊途同归,各擅胜场 在云原生浪潮席卷全球的今天,Kubernetes(K8s)已从谷歌内部的一个容器编排工具,蜕变为云计算时代的基础设施基石,它重塑了应用构建、部署和运维的范式。对于企业技术栈中的两大支柱——以企业级稳健著称的Java和凭借跨平台重生而焕发活力的.NET Core,Kubernetes的到来并非简单的运行环境变迁,而是一场意义深远的、从开发理念到技术生态的全面重塑。本文将深入剖析Kubernetes对这两种主流开发语言的差异化影响,揭示它们与容器编排平台之间千丝万缕的联系,以及在企业数字化转型中的全新定位。 一、 历史交汇:不同的起点,相同的云原生归宿 Java的漫长进化与Kubernetes的天然契合 Java与容器化的结合,是一场“厚积薄发”的相遇。在Kubernetes出现之前,Java世界已经通过Spring Clou

By Ne0inhk
今日AI热榜:从预测引擎到技能目录,再到AI Agency

今日AI热榜:从预测引擎到技能目录,再到AI Agency

🔥 个人主页:杨利杰YJlio❄️ 个人专栏:《Sysinternals实战教程》《Windows PowerShell 实战》《WINDOWS教程》《IOS教程》《微信助手》《锤子助手》《Python》《Kali Linux》《那些年未解决的Windows疑难杂症》🌟 让复杂的事情更简单,让重复的工作自动化 今日AI热榜:从预测引擎到技能目录,再到AI Agency * 1 今日AI热榜:我从这组数据里看到了什么 * 2 今日核心数据速览 * 3 为什么 MiroFish 能冲到第一:它打的是“预测”这张牌 * 4 openai / skills 为什么排第二:因为 Agent 时代最缺的不是模型,是“可复用能力” * 5 agency-agents 热起来的原因:大家已经不满足于“一个万能助手”了 * 6 OpenClaw

By Ne0inhk