当前位置: 首页 > news >正文

C++初阶--类与对象(3)(图解)

文章目录

  • 再谈构造函数
    • 初始化列表
    • 隐式类型转换
    • explicit关键字
  • static成员
  • 友元类
  • 内部类
  • 匿名对象
  • 拷贝函数时的一些优化

再谈构造函数

在我们之前的构造函数中,编译器会通过构造函数,对对象中各个成员给出一个适合的初始值,但这并不能称之为初始化,只是进行赋值而已因为初始化只能初始化一次,而构造函数内部可以进行无数次赋值

初始化列表

初始化列表是用于构造函数中对类成员变量进行初始化的语法特性
通过初始化列表,可以在对象被创建时就将成员变量初始化为指定的值,而不是在构造函数体内逐个赋值。

语法:初始化列表用冒号(:)跟随在构造函数的参数列表之后,并且在构造函数体之前
在初始化列表中,成员变量按照声明顺序列出,并使用逗号进行隔开。
每个成员变量的初始化由成员变量名后跟一个圆括号和初始值或者调用其他构造函数来完成。

试验:

class A
{
private:int _a;
public:A(int a = 1):_a(a){}/*A(int* a):_a(a){}*/A(const A& a){_a = a._a;cout << "A(const A& a)" << endl;}~A(){cout << "~A()" << endl;}
};class Date
{
private:int _year;int _month;int _day;int& _def;const int _n;
public:Date(int year, int month = 1, int day = 1):_year(year),_month(month),_day(day),_def(year),_n(10){}
};
int main()
{Date d1=2023;Date d2 = (2023, 11, 4);Date d3 = { 2023, 11, 4 };return 0;
}

对const成员和引用成员进行测试:

Date的成员变量

在这里插入图片描述
Date类的构造函数
在这里插入图片描述
定义一个对象并初始化为(2023,10,23);
在这里插入图片描述
对于引用和const变量来说,都必须进行初始化
在这里插入图片描述

规范写法:

在这里插入图片描述
在这里插入图片描述

成员变量中有自定义类型时:

在这里插入图片描述
在这里插入图片描述

成员的顺序:

在这里插入图片描述

初始化列表没写全的话:
在这里插入图片描述
在这里插入图片描述

如果自定义类型不是默认构造函数的话:

在这里插入图片描述

在这里插入图片描述

对于自定义类型成员变量的类对象,可以:

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

隐式类型转换

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

多个参数时

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

explicit关键字

这是一个修饰符,用于修饰类的构造函数。当一个构造函数被explicit修饰时,他将被标记为显示构造函数,意味着该构造函数无法进行隐式类型转换

在这里插入图片描述
在这里插入图片描述

static成员

静态类成员静态类成员是被类所有对象所共享的成员变量。它们被声明为静态成员后,在内存中只有一个副本存在,并且在任何实例化对象之前就已经存在了。静态类成员必须在类的外部进行初始化定义。
静态成员函数静态成员函数不在特定的对象上操作,它们没有this指针,可以直接通过类名来访问。

class A
{
public:A(){count++;} A(const A& a1){count++;}~A(){cout << "~A()" << endl;}//调取count成员变量的函数//静态成员函数,特点:没有this指针static int GetCount(){return count;}
private://声明static int count;
};
//定义
int A::count = 0;

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

友元类

友元类是描述两个类之间的特殊关系;
当一个类是另一个类的友元类时,则该类可以访问另一个类的私有成员
通过在类的声明中使用friend关键字来声明友元类。

class Time
{
public:friend class Date;//在Time中声明Date类,在Date中可以直接访问Time的成员变量Time(int hour=1,int mintue=0,int sec=0):_hour(hour),_mintue(mintue),_sec(sec){}
private:int _hour;int _mintue;int _sec;
};class Date
{
private:int _year;int _month;int _day;Time _t;
public:Date(int year, int month, int day):_year(year),_month(month),_day(day){}void SetTime(int hour, int minute, int sec){//可以直接访问私有的成员变量_t._hour = hour;_t._mintue = minute;_t._sec = sec;}
};

在这里插入图片描述

内部类

内部类是一个类的内部定义的另一个类。内部类可以访问外部类的所有成员,包括私有成员,而外部类不能直接访问内部类的成员

class A
{
private:static int k;int h;
public:class B//B天生为A的友元{public:void f(const A& a){cout << k << endl;//k是静态成员,可以直接使用cout << a.h << endl;//h是非静态成员,需要有明确的类对象}};~A(){cout << "~A()" << endl;}
};int A::k = 1;int main()
{A::B b;//B在A类中需要加上作用域符b.f(A());//A()是匿名对象return 0;
}

在这里插入图片描述

匿名对象

匿名对象是在使用过程中直接创建的没有具体名称的对象
它们通常用于临时执行某个方法或操作,或者作为方法的返回值。

语法:ClassName();

实例:

class Foo()
{
public:void display(){cout<<"this is a Foo"<<endl;}
}
int main()
{Foo().display();
}

拷贝函数时的一些优化

class A
{
private:int _a;
public:A(int a=1):_a(a){cout << "A(int a)" << endl;}A(const A& a){cout << "A(const A& a)" << endl;}A& operator=(const A& a){cout << "A& operator=(const A& a)" << endl;if (this != &a){_a = a._a;}return *this;}~A(){cout << "~A()" << endl;}
};void func1(A aa)
{cout << "func()" << endl;
}A func2()
{A aa;return aa;
}A func3(A aa)
{return aa;
}

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

相关文章:

C++初阶--类与对象(3)(图解)

文章目录 再谈构造函数初始化列表隐式类型转换explicit关键字 static成员友元类内部类匿名对象拷贝函数时的一些优化 再谈构造函数 在我们之前的构造函数中&#xff0c;编译器会通过构造函数&#xff0c;对对象中各个成员给出一个适合的初始值&#xff0c;但这并不能称之为初始…...

考研分享第1期 | 末9生物跨专业考研北京大学电子信息404分经验分享

全文概览 一、个人信息 二、关于考研的经验分享 三、最后的小Tips 一、个人信息 姓名&#xff1a;Jackson 本科院校&#xff1a;某末流985生物专业 报考院校&#xff1a;北京大学电子信息专业 择校意向&#xff1a;北航计算机、人大高瓴、复旦软院、清华大学深研院、北…...

openGauss学习笔记-120 openGauss 数据库管理-设置密态等值查询-概述及使用gsql操作密态数据库

文章目录 openGauss学习笔记-120 openGauss 数据库管理-设置密态等值查询-概述及使用gsql操作密态数据库120.1 密态等值查询概述120.2 使用gsql操作密态数据库 openGauss学习笔记-120 openGauss 数据库管理-设置密态等值查询-概述及使用gsql操作密态数据库 120.1 密态等值查询…...

软件自动化测试平台

软件测试分类黑盒、白盒、功能、API、接口、压力测试和性能测试&#xff0c; 自动化测试平台是一种用于自动化执行软件测试过程的工具。 一、自动化测试平台-功能性 1. 接口自动化&#xff1a;对接软件的接口进行测试&#xff0c;验证接口的功能和性能。 2. Web 自动化&…...

springMVC 导出Excel ,并提供下载(处理日期格式问题)

目录 1、POI的三个依赖 2、控制层代码 3、业务层代码 4、参考文献&#xff1a; 1、POI的三个依赖 <!-- POI的三个依赖 --><dependency><groupId>org.apache.poi</groupId><artifactId>poi</artifactId><version>4.1.2</vers…...

软件工程理论与实践 (吕云翔) 第二章软件过程 课后习题及其答案

软件工程理论与实践 (吕云翔) 第二章课后习题 第二章 软件过程 1.判断题 &#xff08;1&#xff09;瀑布模型的最大优点是将软件开发的各个阶段划分得十分清晰。 ( ) &#xff08;2&#xff09;螺旋模型是在瀑布模型和增量模型的基础上增加了风险分析活动。( ) &#xf…...

HTML跳转锚点

跳转锚点适用于本页面和其他页面的任意标签的跳转以及JavaScript的运行 使用方法即给标签加上独一无二的id属性&#xff0c;再使用a标签跳转 如果是其他页面的标签只需加上其他页面的路径&#xff0c;eg.href"其他页面的路径#zp1" id属性的最好不要使用数字开头 <…...

新能源汽车高压线束是如何快速连接到测试设备上进行电性能测试的

快速连接形成稳定的电测试在新能源行业里面是很常见的测试场景&#xff0c;比如说在新能源汽车行业的电池包、电机、电控制器的电性能测试中会有很多高压线束&#xff0c;需要将这些线束和电池包、电控制器、电机与测试设备快速连接在一起进行相关的EOL/DCR测试。 新能源汽车高…...

Azure 机器学习 - 使用受保护工作区时的网络流量流

目录 环境准备入站和出站要求方案&#xff1a;从工作室访问工作区方案&#xff1a;从工作室使用 AutoML、设计器、数据集和数据存储方案&#xff1a;使用计算实例和计算群集方案&#xff1a;使用联机终结点入站通信出站通信 方案&#xff1a;使用 Azure Kubernetes 服务方案&am…...

强化学习中蒙特卡罗方法

一、蒙特卡洛方法 这里将介绍一个学习方法和发现最优策略的方法&#xff0c;用于估计价值函数。与前文不同&#xff0c;这里我们不假设完全了解环境。蒙特卡罗方法只需要经验——来自实际或模拟与环境的交互的样本序列的状态、动作和奖励。从实际经验中学习是引人注目的&#x…...

Pytorch从零开始实战09

Pytorch从零开始实战——YOLOv5-Backbone模块实现 本系列来源于365天深度学习训练营 原作者K同学 文章目录 Pytorch从零开始实战——YOLOv5-Backbone模块实现环境准备数据集模型选择开始训练可视化模型预测总结 环境准备 本文基于Jupyter notebook&#xff0c;使用Python3.…...

Milvus Cloud ——Agent 的展望

Agent 的展望 目前,LLM Agent 大多是处于实验和概念验证的阶段,持续提升 Agent 的能力才能让它真正从科幻走向现实。当然,我们也可以看到,围绕 LLM Agent 的生态也已经开始逐渐丰富,大部分工作都可以归类到以下三个方面进行探索: Agent模型 AgentBench[4] 指出了不同的 L…...

EM@比例恒等式@分式恒等式

文章目录 比例恒等式(分式恒等式)分式等式链例 比例恒等式(分式恒等式) 设 a b c d \frac{a}{b}\frac{c}{d} ba​dc​(0)令这个比值为 k k k,则 a k b akb akb(0-1), c k d ckd ckd(0-2),以下恒等式在表达式有意义的情形下成立(例如分母不为0) 合比定理: a b b c d d \f…...

使用米联客FPGA开发板进行光口开发时遇到的问题总结

使用的开发板型号&#xff1a;米联客MA703FA&#xff0c; 实物图如下 FPGA型号为a35t 米联客提供的开发板资料中的FPGA型号为a100&#xff0c;所以要想使用开发板例程必须进行FPGA的重新选择。如下图 通过对开发板原理图的分析&#xff0c;例程代码不用做任何修改就可使用&am…...

【chat】 1:Ubuntu 20.04.3 编译安装moduo master分支

muduo 基于reactor反应堆模型的多线程C++网络库大佬的官方仓库有cpp17分支看了下cmakelist文件里面还是要依赖不少库,比如boost protobuf而且cpp17 似乎 是2021年的master 是2022更新的那么还是选择master吧。ubuntu版本 Ubuntu 20.04.3 root@k8s-master-2K4G:~# uname -a Lin…...

C#基于inpoutx64读写ECRAM硬件信息

inpoutx64.dll分享路径&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1rOt0xtt9EcsrFQtf7S91ag 提取码&#xff1a;7om1 1.InpOutManager&#xff1a; using System; using System.Collections.Generic; using System.Linq; using System.Runtime.InteropServi…...

图论13-最小生成树-Kruskal算法+Prim算法

文章目录 1 最小生成树2 最小生成树Kruskal算法的实现2.1 算法思想2.2 算法实现2.2.1 如果图不联通&#xff0c;直接返回空&#xff0c;该图没有mst2.2.2 获得图中的所有边&#xff0c;并且进行排序2.2.2.1 Edge类要实现Comparable接口&#xff0c;并重写compareTo方法 2.2.3 取…...

免费博客搭建笔记

title: 免费博客搭建笔记 tags: 博客搭建 本次是对自己在网上学习github搭建一个 &#x1f447;个人免费静态网站的总结当然不是很完美&#x1f447; Bow to the new king iYANG (yangsongl1n.github.io) 接着我会从我的写笔记的个人习惯来逐步介绍如何搭建这个网站 1.写笔…...

网络运维Day10

文章目录 SHELL基础查看有哪些解释器使用usermod修改用户解释器BASH基本特性 shell脚本的设计与运行编写问世脚本脚本格式规范执行shell脚本方法一方法二实验 变量自定义变量环境变量位置变量案例 预定义变量 变量的扩展运用多种引号的区别双引号的应用单引号的应用反撇号或$()…...

@Cacheable 注解的 @CacheManager 示例

pom.xml 依赖包&#xff1a; <dependency><groupId>org.springframework.data</groupId><artifactId>spring-data-redis</artifactId></dependency><dependency><groupId>redis.clients</groupId><artifactId>jed…...

网络编程(Modbus进阶)

思维导图 Modbus RTU&#xff08;先学一点理论&#xff09; 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议&#xff0c;由 Modicon 公司&#xff08;现施耐德电气&#xff09;于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…...

Chapter03-Authentication vulnerabilities

文章目录 1. 身份验证简介1.1 What is authentication1.2 difference between authentication and authorization1.3 身份验证机制失效的原因1.4 身份验证机制失效的影响 2. 基于登录功能的漏洞2.1 密码爆破2.2 用户名枚举2.3 有缺陷的暴力破解防护2.3.1 如果用户登录尝试失败次…...

装饰模式(Decorator Pattern)重构java邮件发奖系统实战

前言 现在我们有个如下的需求&#xff0c;设计一个邮件发奖的小系统&#xff0c; 需求 1.数据验证 → 2. 敏感信息加密 → 3. 日志记录 → 4. 实际发送邮件 装饰器模式&#xff08;Decorator Pattern&#xff09;允许向一个现有的对象添加新的功能&#xff0c;同时又不改变其…...

React Native 开发环境搭建(全平台详解)

React Native 开发环境搭建&#xff08;全平台详解&#xff09; 在开始使用 React Native 开发移动应用之前&#xff0c;正确设置开发环境是至关重要的一步。本文将为你提供一份全面的指南&#xff0c;涵盖 macOS 和 Windows 平台的配置步骤&#xff0c;如何在 Android 和 iOS…...

【力扣数据库知识手册笔记】索引

索引 索引的优缺点 优点1. 通过创建唯一性索引&#xff0c;可以保证数据库表中每一行数据的唯一性。2. 可以加快数据的检索速度&#xff08;创建索引的主要原因&#xff09;。3. 可以加速表和表之间的连接&#xff0c;实现数据的参考完整性。4. 可以在查询过程中&#xff0c;…...

Go 语言接口详解

Go 语言接口详解 核心概念 接口定义 在 Go 语言中&#xff0c;接口是一种抽象类型&#xff0c;它定义了一组方法的集合&#xff1a; // 定义接口 type Shape interface {Area() float64Perimeter() float64 } 接口实现 Go 接口的实现是隐式的&#xff1a; // 矩形结构体…...

linux arm系统烧录

1、打开瑞芯微程序 2、按住linux arm 的 recover按键 插入电源 3、当瑞芯微检测到有设备 4、松开recover按键 5、选择升级固件 6、点击固件选择本地刷机的linux arm 镜像 7、点击升级 &#xff08;忘了有没有这步了 估计有&#xff09; 刷机程序 和 镜像 就不提供了。要刷的时…...

【C语言练习】080. 使用C语言实现简单的数据库操作

080. 使用C语言实现简单的数据库操作 080. 使用C语言实现简单的数据库操作使用原生APIODBC接口第三方库ORM框架文件模拟1. 安装SQLite2. 示例代码:使用SQLite创建数据库、表和插入数据3. 编译和运行4. 示例运行输出:5. 注意事项6. 总结080. 使用C语言实现简单的数据库操作 在…...

处理vxe-table 表尾数据是单独一个接口,表格tableData数据更新后,需要点击两下,表尾才是正确的

修改bug思路&#xff1a; 分别把 tabledata 和 表尾相关数据 console.log() 发现 更新数据先后顺序不对 settimeout延迟查询表格接口 ——测试可行 升级↑&#xff1a;async await 等接口返回后再开始下一个接口查询 ________________________________________________________…...

【Redis】笔记|第8节|大厂高并发缓存架构实战与优化

缓存架构 代码结构 代码详情 功能点&#xff1a; 多级缓存&#xff0c;先查本地缓存&#xff0c;再查Redis&#xff0c;最后才查数据库热点数据重建逻辑使用分布式锁&#xff0c;二次查询更新缓存采用读写锁提升性能采用Redis的发布订阅机制通知所有实例更新本地缓存适用读多…...