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;可以使用任意一个构造函数,于是程序将不知道使用哪一个,会爆错。

列表初始化
听名字就是列一个表进行初始化
语法就是下面这种
-
#include <iostream> -
using namespace std; -
class A -
{ -
int w; -
public: -
A(int j=0):w(j){} -
}; -
int main() -
{ -
A a; -
return 0; -
}
在函数名后加一个分号然后写出变量名 ,变量名后跟一个括号,意思是用括号里这个值来初始化这个变量
注意事项:
- 这种格式只能用于构造函数
- 必须用这种格式来初始化非静态const数据成员和引用数据成员
什么时候初始化列表是必用的呢?
1. 类成员为const类型
2. 类成员为引用类型
-
#include <iostream> -
using namespace std; -
class A -
{ -
public: -
A(int &v) : i(v), p(v), j(v) {} -
void print_val() { cout << "hello:" << i << " " << j << endl;} -
private: -
const int i; -
int p; -
int &j; -
}; -
int main() -
{ -
int pp = 45; -
A b(pp); -
b.print_val(); -
}
![]()
构造函数 所说是起到初始化的作用,但是实际上是通过赋值的操作来进行初始化的,但是const变量 和引用无法通过赋值来进行初始化,所以要用初始化列表。
3. 类成员为没有默认构造函数的类类型
-
#include <iostream> -
using namespace std; -
class Base -
{ -
public: -
Base(int a) : val(a) {} -
private: -
int val; -
}; -
class A -
{ -
public: -
A(int v) : p(v),b(v) {} -
void print_val() { cout << "hello:" << p << endl;} -
private: -
int p; -
Base b; -
}; -
int main() -
{ -
int pp = 45; -
A b(pp); -
b.print_val(); -
}
![]()
原因同样是创建对象时,要初始类成员的每一个成员
(如果没有在初始化列表里面,编译器会自动使用它的默认的构造函数进行初始化,但是它没有默认构造函数,所以会编译报错,所以没有默认构造函数的成员变量需要使用初始化列表进行初始化)
这里如果把初始化列表里的b删掉,就会爆错,同理类存在继承关系,派生类必须在初始化列表里初始化。
4. 如果类存在继承关系,派生类必须在其初始化列表中调用基类的构造函数
PS:若一个类中有其他类的对象,那么该如何初始化这个类呢?
只需在类的构造函数的初始化列表里加上其他类对象的名字及其参数列表即可。
派生类构造函数的执行顺序:
① 调用基类构造函数,初始化基类数据成员;
② 调用子对象构造函数,初始化子对象数据成员;
③ 执行派生类自身的构造函数,初始化自己新增数据成员。
析构函数
析构函数的特点:
- 一个类只有一个析构函数,不能重载
- 名字与类名相同,定义时候要加上~
- 没有参数
- 不能有返回值,没有返回值类型
对应于构造函数初始化对象,析构函数是用来释放对象的内存的,可以将delete等操作放在析构函数里,析构函数在对象离开其作用域的时候自动执行。
对象析构的顺序和创建的顺序相反,即先构造的后析构,后构造的先析构
但这并非绝对成立!!!!
在不同的作用域中的对象,或者具有不同存储类别的对象,调用构造函数和析构函数的顺序也会有所不同
- 一个程序中有多个文件。在多个文件中定义了全局对象,那么这些对象的执行顺序是不确定的;
- 在函数中定义局部自动对象,如果函数被多次调用;多次调用构造函数和析构函数;
- 如果函数中定义静态局部对象;那么函数调用结束时对象并不释放,只有main结束或调用exit时才调用析构函数。
什么时候调用析构函数?
- 如果在函数中定义了一个对象,当函数调用结束时,释放对象前自动执行析构函数
- static 局部对象在函数调用结束时,包含的对象不会被释放,只在main函数结束或调用exit函数时,才调用static局部对象的析构函数。
- 如果定义了一个全局对象,则在程序的流程离开其作用域时(如main函数结束,或exit语句),调用该全局对象的析构函数
- 如果用new运算符动态地建立了一个对象,当用delete 运算符释放对象时,先调用该全局对象的析构函数。
10.4this指针
众所周知,同一个类的多个对象公用一套方法,那么在调用同一套方法的时候,程序是如何知道要访问哪个对象里的成员的呢,答案是通过this指针,类的成员函数里有一个隐藏的指向对象的参数就是this指针。
具体看下面这个例子
-
#include <iostream> -
using namespace std; -
class Base -
{ -
public: -
Base(int a) : val(a) {} -
void display(); -
private: -
int val; -
}; -
void Base::display() -
{ -
cout<<val<<endl;//实际上就是cout<<this->val<<endl; -
} -
int main() -
{ -
Base a(1),b(2); -
a.display();//看上去没有传参数,实际上传了a的地址 -
}
![]()
10.5对象数组
对象数组跟结构体差不多,这里就讲讲一些不同点。
首先是初始化,由于对象有构造函数,所以我们在初始化对象数组的时候要用大括号括起来,将构造函数列出来,来进行初始化
例如
-
const int max=4; -
fun a[max]={ fun(1),fun(2),fun(3),fun(5)} -
如果类只有一个成员变量,则可以直接像数组那样赋值 -
如:fun b[max]={1,2,3,4};
10.6对象指针
什么是对象指针?
创建一个类的对象时,系统会为每一个对象分配一定的存储空间,以存放成员。对象空间的起始地址就是对象的指针。可以定义一个指针,用来存放对象的指针。
语法
-
time *pt; -
time t; -
pt=&t1; // 指针指向对象
对象指针的使用与普通指针使用差不多,具体可以自行百度指针的使用
相关文章:
C++学习第三十七天----第十章--对象和类
10.2.2 C中的类 类是一种将抽象转换未用户定义类型的C工具,它将数据表示和操作数据的方法合成一个整洁的包。 接口:一个共享框架,供两个系统交互时使用。 1.访问控制 使用类对象的程序可以直接访问类的公有部分,但只能通过公有…...
TikTok影响力经济:解锁社交媒体的商业机遇
社交媒体平台的崛起改变了我们与世界互动的方式,而TikTok作为其中的一员,已经成为全球范围内的现象。这个短视频应用不仅让用户在几秒钟内分享创意和娱乐,还为企业和创作者提供了巨大的商业机会。本文将深入探讨TikTok的影响力经济࿰…...
燃气管网监测系统|全面保障燃气安全
根据新华日报的报道,2023年上半年,我国共发生了294起燃气事故,造成了57人死亡和190人受伤,燃气事故的发生原因有很多,其中涉及到燃气泄漏、设备故障等因素。因此,加强燃气安全管理,提高城市的安…...
第三章:人工智能深度学习教程-基础神经网络(第六节-ML深度学习层列表)
要指定所有层按顺序连接的神经网络的架构,请直接创建层数组。要指定层可以有多个输入或输出的网络架构,请使用 LayerGraph 对象。使用以下函数创建不同的图层类型。 输入层: 功能描述图像输入层 将图像输入网络应用数据标准化序列输入层 将…...
福建科立讯通信 指挥调度管理平台RCE漏洞复现
0x01 产品简介 福建科立讯通信指挥调度管理平台是一个专门针对通信行业的管理平台。该产品旨在提供高效的指挥调度和管理解决方案,以帮助通信运营商或相关机构实现更好的运营效率和服务质量。该平台提供强大的指挥调度功能,可以实时监控和管理通信网络设…...
性能测试:Jenkins+Ant+Jmeter自动化框架的搭建方法
前言 前面讲了Jmeter在性能测试中的应用及扩展。随着测试的深入,我们发现在性能测试中也会遇到不少的重复工作。 比如某新兴业务处于上升阶段,需要在每个版本中,对某些新增接口进行性能测试,有时还需要在一天中的不同时段分别进行…...
【开源项目】snakeflow流程引擎研究
项目地址 https://gitee.com/yuqs/snakerflow https://toscode.mulanos.cn/zc-libre/snakerflow-spring-boot-stater (推荐) 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脑控机器人应用前景如何?
脑控机器人应用前景可谓广阔无边。其轻松的风格不仅使我们能够享受更便捷、更舒适的生活,还为我们带来了无限的可能性。 首先,脑控机器人应用可以在医疗领域发挥重要作用。通过与人类大脑的直接连接,脑控机器人可以为残疾人士提供更高效的康…...
Apache和Nginx实现虚拟主机的3种方式
目录 首先介绍一下Apache和nginx: Nginx和Apache的不同之处: 虚拟主机 准备工作 Apache实现: 方法1:使用不同的ip来实现 方法2:使用相同的ip,不同的端口来实现 方法3:使用相同的ip&…...
【DP】背包问题全解
一.简介 DP(动态规划)背包问题是一个经典的组合优化问题,通常用来解决资源分配的问题,如货物装载、投资组合优化等。问题的核心思想是在有限的资源约束下,选择一组物品以最大化某种价值指标,通常是总价值或…...
04 jenkins中使用各种变量(Powershell、cmd)
批处理中使用jenkins内部和变量插件定义的环境变量:%WORKSPACE%Powershell插件中使用jenkins内部环境变量:${ENV:WORKSPRACE}Powershell函数内部使用函数入参:$($dllname)Powershell中定义变量:$DllNamePowershell中使用powershel…...
2023年云计算的发展趋势
随着互联网和信息技术的快速发展,云计算已经成为了企业和个人的重要工具,而在未来,云计算仍然会持续发展,并且发展趋势会更加迅猛。在本文中,我们将讨论2023年云计算的发展趋势。 一、混合云将成为主流 混合云是指将公…...
工作十年+的测试应该具备什么能力?
大概是2014年的时候,我开始接触面试工作,就是从应聘者转为面试官,记得印象深刻的是面试了一位做了8年的测试。对方气场很足,嗯,毕竟那时的我还只是一个3、4年经验的小测试,相反,印象深刻的并不是…...
区块链链游合约系统开发项目模式技术方案
随着区块链技术的发展,链游合约系统开发逐渐成为了一个备受关注的项目。本文将探讨区块链链游合约系统开发项目的技术方案,包括项目背景、开发目标、技术架构、系统流程、安全措施等方面的内容。 一、项目背景 链游是一种基于区块链技术的游戏…...
业务出海之服务器探秘
这几年随着国内互联网市场的逐渐饱和,越来越多的公司加入到出海的行列,很多领域都取得了很不错的成就。虽然出海可以获得更加广阔的市场,但也需要面对很多之前在国内可能没有重视的一些问题。集中在海外服务器的选择维度上就有很大的变化。例…...
飞天使-django创建一个初始项目过程
创建django项目 运行项目 运行命令 pyhont manage.py runserver 然后访问 http://127.0.0.1:8000/, 则可以打开本地新建的项目 虚拟环境的部署-mac 在一台计算机上可以通过虚拟环境实现多个版本Django的开发环境 安装虚拟环境工具:如果你的系统中没有安…...
【工具插件类教学】全局积雪系统和雪痕迹显示(移动痕迹)
目录 一、演示场景对比效果 二、导入工具插件 三、使用流程 1.添加脚本组件GlobalSnow...
软考-高级-系统架构设计师教程(清华第2版)【第3章 信息系统基础知识(p120~159)-思维导图】
软考-高级-系统架构设计师教程(清华第2版)【第3章 信息系统基础知识(p120~159)-思维导图】 课本里章节里所有蓝色字体的思维导图...
STM32基础--NVIC中断控制器
一、NVIC是什么? NVIC是一种中断控制器。当一个中断正在处理时,另一个更高优先级的中断可以打断当前中断的执行,并立即得到处理。这种机制使得处理器在高速运行的同时,能够及时响应不同优先级的中断请求。 二、有哪些优先级&…...
小电脑4种主流连接方案全解:直连屏/采集卡/网卡网线/NoMachine
在使用嵌入式开发板、迷你主机、机器人机载小电脑等设备时,如何高效连接、显示画面、远程控制是入门第一步。很多同学容易混淆“直连网线、网卡、采集卡、远程桌面”的区别,本文一次性讲清楚四种常用连接方式,包含用途、所需硬件、详细操作、…...
PUBG实时数据雷达:开源游戏辅助工具的战场信息解决方案
PUBG实时数据雷达:开源游戏辅助工具的战场信息解决方案 【免费下载链接】PUBG-maphack-map this is a working copy online-map from jussihi/PUBG-map-hack, use nodejs webserver instead of firebase. 项目地址: https://gitcode.com/gh_mirrors/pu/PUBG-mapha…...
Python 数据库操作:精准获取指定行指定列的完整指南
🎯 Python 数据库操作:精准获取指定行指定列的完整指南 下面给你分场景、给可直接运行的代码,覆盖所有常用需求,从基础到进阶一次性讲透。 一、核心前提:先拿到完整结果集 基于你之前的代码,我们先拿到所有数据和字段名: # 执行查询 sql = "SELECT * FROM user…...
保健及护理用家具市场:548.6亿元规模下的多维洞察
据恒州诚思调研统计,2025年全球保健及护理用家具收入规模约达466.7亿元,预计到2032年,这一数字将接近548.6亿元,2026 - 2032年的复合年增长率(CAGR)为2.5%。在医疗行业不断发展、人口结构持续变化的背景下&…...
数字资产管理问题的创新解法:WeChatMsg的本地化数据主权实现
数字资产管理问题的创新解法:WeChatMsg的本地化数据主权实现 【免费下载链接】WeChatMsg 提取微信聊天记录,将其导出成HTML、Word、CSV文档永久保存,对聊天记录进行分析生成年度聊天报告 项目地址: https://gitcode.com/GitHub_Trending/we…...
提升开发效率的跨平台游戏开发框架:从概念到发布的全流程指南
提升开发效率的跨平台游戏开发框架:从概念到发布的全流程指南 【免费下载链接】FXGL Java / JavaFX / Kotlin Game Library (Engine) 项目地址: https://gitcode.com/gh_mirrors/fx/FXGL 价值定位:为何选择FXGL游戏开发框架 在游戏开发领域&…...
LPDDR6的DVFS模式详解:如何用VDD2C/D和四种新策略优化手机续航与性能?
LPDDR6的DVFS模式详解:如何用VDD2C/D和四种新策略优化手机续航与性能? 当你在玩手机游戏时突然电量告急,或是观看高清视频时设备发烫降频,这背后其实是一场关于内存功耗的精密博弈。LPDDR6作为下一代移动设备内存标准,…...
解锁3大维度:Helix Toolkit如何重构.NET开发者的3D开发体验
解锁3大维度:Helix Toolkit如何重构.NET开发者的3D开发体验 【免费下载链接】helix-toolkit Helix Toolkit is a collection of 3D components for .NET. 项目地址: https://gitcode.com/gh_mirrors/he/helix-toolkit Helix Toolkit是一套功能完备的.NET 3D组…...
C#开发者必看:INIFileParser库解决INI配置文件乱码问题的实战指南
C#开发者必看:INIFileParser库解决INI配置文件乱码问题的实战指南 在Windows应用开发中,INI文件作为一种轻量级配置存储格式,至今仍被广泛使用。但许多C#开发者发现,当配置文件路径包含中文、空格或特殊字符时,传统的W…...
3种核心技术实现Cursor Pro功能无限访问的深度解析
3种核心技术实现Cursor Pro功能无限访问的深度解析 【免费下载链接】cursor-free-vip [Support 0.45](Multi Language 多语言)自动注册 Cursor Ai ,自动重置机器ID , 免费升级使用Pro 功能: Youve reached your trial request lim…...
