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

C++学习第三十七天----第十章--对象和类

10.2.2 C++中的类

类是一种将抽象转换未用户定义类型的C++工具,它将数据表示和操作数据的方法合成一个整洁的包。

接口:一个共享框架,供两个系统交互时使用。

1.访问控制

使用类对象的程序可以直接访问类的公有部分,但只能通过公有成员函数访问对象的私有成员

防止程序直接访问数据被称为数据隐藏。

数据隐藏不仅可以防止直接访问数据,而且还让开发者无需了解数据是如何被表示的。

将实现细节放在一起并将它们与抽象分开称为封装

2.private和public

在类中使用private来强调成员是私有的,public强调成员是公有的。

在class声明的类中,成员默认是私有的,而在struct中成员默认是公有的。

10.2.3实现类的成员函数

定义成员函数时,使用作用域解析运算符::来来标识函数所属的类

类方法可以访问类的private组件

如stock是一个类名,它有一个叫fun的成员函数

void stock::fun()

{

。。。。

}

1.内联函数

定义在类声明中的函数都将自动成为内联函数,类声明常将短小的成员函数作为内联函数,如果想在类外声明内联函数,可以使用inline关键字。

内联函数要求每个使用它们的文件中都对其进行定义,为了方便使用内联函数,我们将内联函数放在类的头文件中。

2.方法使用哪个对象

创建对象: 类名 对象名(类名相当于一种数据类型 对象名是变量)

使用成员函数方法 对象名.函数名(参数)

10.3类的构造函数和析构函数

对象的变量不能像初始化int变量 那样来进行初始化,因为对象的存在私有成员,在类外无法进行访问。而类的成员函数可以访问这些成员变量,因此我们可以使用类的成员函数对对象进行初始化,而类的构造函数就是C++用来初始化对象的一个函数。

构造函数在创建对象的时候会被自动调用。

构造函数:

名字必须与类名一致,且没有返回类型,可以有参数,可以重载(也就是可以有多个构造函数)。如fun类的构造函数为 fun();

若不定义构造函数,程序将提供一个默认的隐藏的构造函数,而这个构造函数并不进行任何操作。若手动定义了多个构造函数,

程序则会根据定义对象时候括号里的参数,来确定使用哪一个构造函数。

如果提供了非默认的构造函数,下列语句会出错

fun A;定义一个fun类的对象A 

有两种方法可以解决这个问题,一是在类里加入一个默认的构造函数,二是给非默认的构造函数提供默认参数。

但是这两种方法不能同时用,如果同时用的话,fun A;可以使用任意一个构造函数,于是程序将不知道使用哪一个,会爆错。

列表初始化

听名字就是列一个表进行初始化

语法就是下面这种

 
  1. #include <iostream>

  2. using namespace std;

  3. class A

  4. {

  5. int w;

  6. public:

  7. A(int j=0):w(j){}

  8. };

  9. int main()

  10. {

  11. A a;

  12. return 0;

  13. }

在函数名后加一个分号然后写出变量名 ,变量名后跟一个括号,意思是用括号里这个值来初始化这个变量

注意事项:

  1. 这种格式只能用于构造函数
  2. 必须用这种格式来初始化非静态const数据成员和引用数据成员

什么时候初始化列表是必用的呢?

1. 类成员为const类型

2. 类成员为引用类型

 
  1. #include <iostream>

  2. using namespace std;

  3. class A

  4. {

  5. public:

  6. A(int &v) : i(v), p(v), j(v) {}

  7. void print_val() { cout << "hello:" << i << " " << j << endl;}

  8. private:

  9. const int i;

  10. int p;

  11. int &j;

  12. };

  13. int main()

  14. {

  15. int pp = 45;

  16. A b(pp);

  17. b.print_val();

  18. }

构造函数 所说是起到初始化的作用,但是实际上是通过赋值的操作来进行初始化的,但是const变量 和引用无法通过赋值来进行初始化,所以要用初始化列表。

3. 类成员为没有默认构造函数的类类型

 
  1. #include <iostream>

  2. using namespace std;

  3. class Base

  4. {

  5. public:

  6. Base(int a) : val(a) {}

  7. private:

  8. int val;

  9. };

  10. class A

  11. {

  12. public:

  13. A(int v) : p(v),b(v) {}

  14. void print_val() { cout << "hello:" << p << endl;}

  15. private:

  16. int p;

  17. Base b;

  18. };

  19. int main()

  20. {

  21. int pp = 45;

  22. A b(pp);

  23. b.print_val();

  24. }

原因同样是创建对象时,要初始类成员的每一个成员

(如果没有在初始化列表里面,编译器会自动使用它的默认的构造函数进行初始化,但是它没有默认构造函数,所以会编译报错,所以没有默认构造函数的成员变量需要使用初始化列表进行初始化)

这里如果把初始化列表里的b删掉,就会爆错,同理类存在继承关系,派生类必须在初始化列表里初始化。

4. 如果类存在继承关系,派生类必须在其初始化列表中调用基类的构造函数

PS:若一个类中有其他类的对象,那么该如何初始化这个类呢?

只需在类的构造函数的初始化列表里加上其他类对象的名字及其参数列表即可。

派生类构造函数的执行顺序

① 调用基类构造函数,初始化基类数据成员;

② 调用子对象构造函数,初始化子对象数据成员;

③ 执行派生类自身的构造函数,初始化自己新增数据成员。

析构函数

析构函数的特点:

  1. 一个类只有一个析构函数,不能重载
  2. 名字与类名相同,定义时候要加上~
  3. 没有参数
  4. 不能有返回值,没有返回值类型

对应于构造函数初始化对象,析构函数是用来释放对象的内存的,可以将delete等操作放在析构函数里,析构函数在对象离开其作用域的时候自动执行。

对象析构的顺序和创建的顺序相反,即先构造的后析构,后构造的先析构

但这并非绝对成立!!!!

在不同的作用域中的对象,或者具有不同存储类别的对象,调用构造函数和析构函数的顺序也会有所不同

  1. 一个程序中有多个文件。在多个文件中定义了全局对象,那么这些对象的执行顺序是不确定的;
  2. 在函数中定义局部自动对象,如果函数被多次调用;多次调用构造函数和析构函数;
  3. 如果函数中定义静态局部对象;那么函数调用结束时对象并不释放,只有main结束或调用exit时才调用析构函数。

 

什么时候调用析构函数?

  1. 如果在函数中定义了一个对象,当函数调用结束时,释放对象前自动执行析构函数
  2. static 局部对象在函数调用结束时,包含的对象不会被释放,只在main函数结束或调用exit函数时,才调用static局部对象的析构函数。
  3. 如果定义了一个全局对象,则在程序的流程离开其作用域时(如main函数结束,或exit语句),调用该全局对象的析构函数
  4. 如果用new运算符动态地建立了一个对象,当用delete 运算符释放对象时,先调用该全局对象的析构函数。
10.4this指针

众所周知,同一个类的多个对象公用一套方法,那么在调用同一套方法的时候,程序是如何知道要访问哪个对象里的成员的呢,答案是通过this指针,类的成员函数里有一个隐藏的指向对象的参数就是this指针。

具体看下面这个例子

 
  1. #include <iostream>

  2. using namespace std;

  3. class Base

  4. {

  5. public:

  6. Base(int a) : val(a) {}

  7. void display();

  8. private:

  9. int val;

  10. };

  11. void Base::display()

  12. {

  13. cout<<val<<endl;//实际上就是cout<<this->val<<endl;

  14. }

  15. int main()

  16. {

  17. Base a(1),b(2);

  18. a.display();//看上去没有传参数,实际上传了a的地址

  19. }

 
10.5对象数组

对象数组跟结构体差不多,这里就讲讲一些不同点。

首先是初始化,由于对象有构造函数,所以我们在初始化对象数组的时候要用大括号括起来,将构造函数列出来,来进行初始化

例如

 
  1. const int max=4;

  2. fun a[max]={ fun(1),fun(2),fun(3),fun(5)}

  3. 如果类只有一个成员变量,则可以直接像数组那样赋值

  4. 如:fun b[max]={1,2,3,4};

10.6对象指针

什么是对象指针?

创建一个类的对象时,系统会为每一个对象分配一定的存储空间,以存放成员。对象空间的起始地址就是对象的指针。可以定义一个指针,用来存放对象的指针。

语法

 
  1. time *pt;

  2. time t;

  3. pt=&t1; // 指针指向对象

对象指针的使用与普通指针使用差不多,具体可以自行百度指针的使用

 

相关文章:

C++学习第三十七天----第十章--对象和类

10.2.2 C中的类 类是一种将抽象转换未用户定义类型的C工具&#xff0c;它将数据表示和操作数据的方法合成一个整洁的包。 接口&#xff1a;一个共享框架&#xff0c;供两个系统交互时使用。 1.访问控制 使用类对象的程序可以直接访问类的公有部分&#xff0c;但只能通过公有…...

TikTok影响力经济:解锁社交媒体的商业机遇

社交媒体平台的崛起改变了我们与世界互动的方式&#xff0c;而TikTok作为其中的一员&#xff0c;已经成为全球范围内的现象。这个短视频应用不仅让用户在几秒钟内分享创意和娱乐&#xff0c;还为企业和创作者提供了巨大的商业机会。本文将深入探讨TikTok的影响力经济&#xff0…...

燃气管网监测系统|全面保障燃气安全

根据新华日报的报道&#xff0c;2023年上半年&#xff0c;我国共发生了294起燃气事故&#xff0c;造成了57人死亡和190人受伤&#xff0c;燃气事故的发生原因有很多&#xff0c;其中涉及到燃气泄漏、设备故障等因素。因此&#xff0c;加强燃气安全管理&#xff0c;提高城市的安…...

第三章:人工智能深度学习教程-基础神经网络(第六节-ML深度学习层列表)

要指定所有层按顺序连接的神经网络的架构&#xff0c;请直接创建层数组。要指定层可以有多个输入或输出的网络架构&#xff0c;请使用 LayerGraph 对象。使用以下函数创建不同的图层类型。 输入层&#xff1a; 功能描述图像输入层 将图像输入网络应用数据标准化序列输入层 将…...

福建科立讯通信 指挥调度管理平台RCE漏洞复现

0x01 产品简介 福建科立讯通信指挥调度管理平台是一个专门针对通信行业的管理平台。该产品旨在提供高效的指挥调度和管理解决方案&#xff0c;以帮助通信运营商或相关机构实现更好的运营效率和服务质量。该平台提供强大的指挥调度功能&#xff0c;可以实时监控和管理通信网络设…...

性能测试:Jenkins+Ant+Jmeter自动化框架的搭建方法

前言 前面讲了Jmeter在性能测试中的应用及扩展。随着测试的深入&#xff0c;我们发现在性能测试中也会遇到不少的重复工作。 比如某新兴业务处于上升阶段&#xff0c;需要在每个版本中&#xff0c;对某些新增接口进行性能测试&#xff0c;有时还需要在一天中的不同时段分别进行…...

【开源项目】snakeflow流程引擎研究

项目地址 https://gitee.com/yuqs/snakerflow https://toscode.mulanos.cn/zc-libre/snakerflow-spring-boot-stater &#xff08;推荐&#xff09; https://github.com/snakerflow-starter/snakerflow-spring-boot-starter 常用API 部署流程 processId engine.process().de…...

11.10 知识总结(数据的增删改查、如何创建表关系、Django框架的请求生命周期流程图)

一、 数据的增删改查 1.1 用户列表的展示 把数据表中得用户数据都给查询出来展示在页面上 添加数据 id username password gender age action 修改 删除 1.2 修…...

AI脑控机器人应用前景如何?

脑控机器人应用前景可谓广阔无边。其轻松的风格不仅使我们能够享受更便捷、更舒适的生活&#xff0c;还为我们带来了无限的可能性。 首先&#xff0c;脑控机器人应用可以在医疗领域发挥重要作用。通过与人类大脑的直接连接&#xff0c;脑控机器人可以为残疾人士提供更高效的康…...

Apache和Nginx实现虚拟主机的3种方式

目录 首先介绍一下Apache和nginx&#xff1a; Nginx和Apache的不同之处&#xff1a; 虚拟主机 准备工作 Apache实现&#xff1a; 方法1&#xff1a;使用不同的ip来实现 方法2&#xff1a;使用相同的ip&#xff0c;不同的端口来实现 方法3&#xff1a;使用相同的ip&…...

【DP】背包问题全解

一.简介 DP&#xff08;动态规划&#xff09;背包问题是一个经典的组合优化问题&#xff0c;通常用来解决资源分配的问题&#xff0c;如货物装载、投资组合优化等。问题的核心思想是在有限的资源约束下&#xff0c;选择一组物品以最大化某种价值指标&#xff0c;通常是总价值或…...

04 jenkins中使用各种变量(Powershell、cmd)

批处理中使用jenkins内部和变量插件定义的环境变量&#xff1a;%WORKSPACE%Powershell插件中使用jenkins内部环境变量&#xff1a;${ENV:WORKSPRACE}Powershell函数内部使用函数入参&#xff1a;$($dllname)Powershell中定义变量&#xff1a;$DllNamePowershell中使用powershel…...

2023年云计算的发展趋势

随着互联网和信息技术的快速发展&#xff0c;云计算已经成为了企业和个人的重要工具&#xff0c;而在未来&#xff0c;云计算仍然会持续发展&#xff0c;并且发展趋势会更加迅猛。在本文中&#xff0c;我们将讨论2023年云计算的发展趋势。 一、混合云将成为主流 混合云是指将公…...

工作十年+的测试应该具备什么能力?

大概是2014年的时候&#xff0c;我开始接触面试工作&#xff0c;就是从应聘者转为面试官&#xff0c;记得印象深刻的是面试了一位做了8年的测试。对方气场很足&#xff0c;嗯&#xff0c;毕竟那时的我还只是一个3、4年经验的小测试&#xff0c;相反&#xff0c;印象深刻的并不是…...

区块链链游合约系统开发项目模式技术方案

​随着区块链技术的发展&#xff0c;链游合约系统开发逐渐成为了一个备受关注的项目。本文将探讨区块链链游合约系统开发项目的技术方案&#xff0c;包括项目背景、开发目标、技术架构、系统流程、安全措施等方面的内容。 一、项目背景 链游是一种基于区块链技术的游戏&#xf…...

业务出海之服务器探秘

这几年随着国内互联网市场的逐渐饱和&#xff0c;越来越多的公司加入到出海的行列&#xff0c;很多领域都取得了很不错的成就。虽然出海可以获得更加广阔的市场&#xff0c;但也需要面对很多之前在国内可能没有重视的一些问题。集中在海外服务器的选择维度上就有很大的变化。例…...

飞天使-django创建一个初始项目过程

创建django项目 运行项目 运行命令 pyhont manage.py runserver 然后访问 http://127.0.0.1:8000/&#xff0c; 则可以打开本地新建的项目 虚拟环境的部署-mac 在一台计算机上可以通过虚拟环境实现多个版本Django的开发环境 安装虚拟环境工具&#xff1a;如果你的系统中没有安…...

【工具插件类教学】全局积雪系统和雪痕迹显示(移动痕迹)

目录 一、演示场景对比效果 ​二、导入工具插件 三、使用流程 1.添加脚本组件GlobalSnow...

​软考-高级-系统架构设计师教程(清华第2版)【第3章 信息系统基础知识(p120~159)-思维导图】​

软考-高级-系统架构设计师教程&#xff08;清华第2版&#xff09;【第3章 信息系统基础知识(p120~159)-思维导图】 课本里章节里所有蓝色字体的思维导图...

STM32基础--NVIC中断控制器

一、NVIC是什么&#xff1f; NVIC是一种中断控制器。当一个中断正在处理时&#xff0c;另一个更高优先级的中断可以打断当前中断的执行&#xff0c;并立即得到处理。这种机制使得处理器在高速运行的同时&#xff0c;能够及时响应不同优先级的中断请求。 二、有哪些优先级&…...

边缘计算医疗风险自查APP开发方案

核心目标:在便携设备(智能手表/家用检测仪)部署轻量化疾病预测模型,实现低延迟、隐私安全的实时健康风险评估。 一、技术架构设计 #mermaid-svg-iuNaeeLK2YoFKfao {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg…...

可靠性+灵活性:电力载波技术在楼宇自控中的核心价值

可靠性灵活性&#xff1a;电力载波技术在楼宇自控中的核心价值 在智能楼宇的自动化控制中&#xff0c;电力载波技术&#xff08;PLC&#xff09;凭借其独特的优势&#xff0c;正成为构建高效、稳定、灵活系统的核心解决方案。它利用现有电力线路传输数据&#xff0c;无需额外布…...

iPhone密码忘记了办?iPhoneUnlocker,iPhone解锁工具Aiseesoft iPhone Unlocker 高级注册版​分享

平时用 iPhone 的时候&#xff0c;难免会碰到解锁的麻烦事。比如密码忘了、人脸识别 / 指纹识别突然不灵&#xff0c;或者买了二手 iPhone 却被原来的 iCloud 账号锁住&#xff0c;这时候就需要靠谱的解锁工具来帮忙了。Aiseesoft iPhone Unlocker 就是专门解决这些问题的软件&…...

c++ 面试题(1)-----深度优先搜索(DFS)实现

操作系统&#xff1a;ubuntu22.04 IDE:Visual Studio Code 编程语言&#xff1a;C11 题目描述 地上有一个 m 行 n 列的方格&#xff0c;从坐标 [0,0] 起始。一个机器人可以从某一格移动到上下左右四个格子&#xff0c;但不能进入行坐标和列坐标的数位之和大于 k 的格子。 例…...

vue3 字体颜色设置的多种方式

在Vue 3中设置字体颜色可以通过多种方式实现&#xff0c;这取决于你是想在组件内部直接设置&#xff0c;还是在CSS/SCSS/LESS等样式文件中定义。以下是几种常见的方法&#xff1a; 1. 内联样式 你可以直接在模板中使用style绑定来设置字体颜色。 <template><div :s…...

C# 求圆面积的程序(Program to find area of a circle)

给定半径r&#xff0c;求圆的面积。圆的面积应精确到小数点后5位。 例子&#xff1a; 输入&#xff1a;r 5 输出&#xff1a;78.53982 解释&#xff1a;由于面积 PI * r * r 3.14159265358979323846 * 5 * 5 78.53982&#xff0c;因为我们只保留小数点后 5 位数字。 输…...

安卓基础(aar)

重新设置java21的环境&#xff0c;临时设置 $env:JAVA_HOME "D:\Android Studio\jbr" 查看当前环境变量 JAVA_HOME 的值 echo $env:JAVA_HOME 构建ARR文件 ./gradlew :private-lib:assembleRelease 目录是这样的&#xff1a; MyApp/ ├── app/ …...

【51单片机】4. 模块化编程与LCD1602Debug

1. 什么是模块化编程 传统编程会将所有函数放在main.c中&#xff0c;如果使用的模块多&#xff0c;一个文件内会有很多代码&#xff0c;不利于组织和管理 模块化编程则是将各个模块的代码放在不同的.c文件里&#xff0c;在.h文件里提供外部可调用函数声明&#xff0c;其他.c文…...

goreplay

1.github地址 https://github.com/buger/goreplay 2.简单介绍 GoReplay 是一个开源的网络监控工具&#xff0c;可以记录用户的实时流量并将其用于镜像、负载测试、监控和详细分析。 3.出现背景 随着应用程序的增长&#xff0c;测试它所需的工作量也会呈指数级增长。GoRepl…...

GraphRAG优化新思路-开源的ROGRAG框架

目前的如微软开源的GraphRAG的工作流程都较为复杂&#xff0c;难以孤立地评估各个组件的贡献&#xff0c;传统的检索方法在处理复杂推理任务时可能不够有效&#xff0c;特别是在需要理解实体间关系或多跳知识的情况下。先说结论&#xff0c;看完后感觉这个框架性能上不会比Grap…...