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; // 指针指向对象

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

 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

考研的风吹到你了吗?中国人民大学与加拿大女王大学金融硕士为你提供另一读研途径

24考研的风吹到你了吗&#xff1f;随着社会的不断发展&#xff0c;越来越多的人选择继续深造&#xff0c;通过考研来提升自己的学历和能力。然而&#xff0c;考研并不是一件容易的事情&#xff0c;需要付出大量的时间和精力。面对国内竞争激烈的考研环境&#xff0c;许多人会选…

OpenHarmony worker详解

一&#xff0c;定义 worker是与主线程并行的独立线程。创建Worker的线程被称为宿主线程&#xff0c;Worker工作的线程被称为Worker线程。创建Worker时传入的脚本文件在Worker线程中执行&#xff0c;通常在Worker线程中处理耗时的操作&#xff0c;需要注意的是&#xff0c;Work…

Jenkins的介绍与相关配置

Jenkins的介绍与配置 一.CI/CD介绍 &#xff11;.CI/CD概念 ①CI 中文意思是持续集成 (Continuous Integration, CI) 是一种软件开发流程&#xff0c;核心思想是在代码库中的每个提交都通过自动化的构建和测试流程进行验证。这种方法可以帮助团队更加频繁地交付软件&#x…

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

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

OpenCV 实现透视变换

一&#xff1a;OpenCV透视变换的概念 仿射变换(affine transform)与透视变换(perspective transform)在图像还原、图像局部变化处理方面有重要意义。通常&#xff0c;在2D平面中&#xff0c;仿射变换的应用较多&#xff0c;而在3D平面中&#xff0c;透视变换又有了自己的一席之…

接口自动化测试操作流程

接口自动化大致步骤&#xff1a; 1、发送请求 2、解析结果 3、验证结果 定义三个和业务相关的类 1、一个用来封装HTTPclient&#xff0c;用来发送请求 2、解析结果xml的类 3、一个用于比较测试结果和期望值的类&#xff0c;用于验证 4、自动生成报告的类&#xff1a;自…

sqlite expert数据库导入编辑好的表格

一、前言 此功能不常用&#xff0c;但是又非常重要&#xff0c;每次想要用忘记了方法还得上网搜索&#xff0c;这里自己记录一下&#xff0c;方便以后查看&#xff0c;也帮助大家快速使用 二、环境 window sqlite3 三、正文 步骤一&#xff1a;在数据库创建空表格&#x…

2023年云计算的发展趋势

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

《Linux从练气到飞升》No.26 Linux中的线程控制

&#x1f57a;作者&#xff1a; 主页 我的专栏C语言从0到1探秘C数据结构从0到1探秘Linux菜鸟刷题集 &#x1f618;欢迎关注&#xff1a;&#x1f44d;点赞&#x1f64c;收藏✍️留言 &#x1f3c7;码字不易&#xff0c;你的&#x1f44d;点赞&#x1f64c;收藏❤️关注对我真的…

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

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

一文让你了解网络刷卡器的特点和优势

网络刷卡器一款高性能的多协议电子标签读写器&#xff0c;保持高识读率的同时实现对电子标签的快速读写处理&#xff0c;广泛应用于物流追踪、个人身份识别、人员管理、智能停车场、门禁考勤、公交一卡通、餐饮、金融等多个领域。 特点和优势&#xff1a; 1&#xff09;低功耗、…

python 路径变更后 pip 运行报错

python 路径变更后 pip 运行报错 Fatal error in launcher: Unable to create process using "d:\python-3.6.6\python .exe" "D:\python-3........出现这种原因是因为生产 Scripts\pip.exe中存在绝对路径&#xff0c;因此当python变更过路径后所有 Scripts目…

新型的铁塔基站“能源管家”

安科瑞 崔丽洁 引言&#xff1a;随着5G基站的迅猛发展&#xff0c;基站的能耗问题也越来越突出&#xff0c;高效可靠的基站配电系统方案&#xff0c;是提高基站能耗使用效率&#xff0c;实现基站节能降耗的重要保证&#xff0c;通过多回路仪表监测每个配电回路的用电负载情况&a…

微信小程序广告banner、滚动屏怎么做?

使用滑块视图容器swiper和swiper-item可以制作滚动屏&#xff0c;代码如下&#xff1a; wxml: <swiper indicator-dots indicator-color"rgba(255,255,255,0.5)" indicator-active-color"white" autoplay interval"3000"><swiper-ite…

VR全景技术在城市园区发展中有哪些应用与帮助

引言&#xff1a; 在数字化时代的浪潮中&#xff0c;虚拟现实&#xff08;VR&#xff09;全景技术逐渐融入各个领域&#xff0c;也为城市园区展示带来了全新的可能性。 一&#xff0e;VR全景技术简介 虚拟现实全景技术是一种通过全景图像和视频模拟真实环境的技术。通过相关设…

一篇文章搞明白js运行机制——事件循环

1、解释 JavaScript 的执行机制。 JavaScript 的执行机制基于事件循环。事件循环包括一个任务队列&#xff08;Task Queue&#xff09;和一个微任务队列&#xff08;Microtask Queue&#xff09;。当一个函数被调用时&#xff0c;它被添加到微任务队列中。事件循环每次迭代都会…

腾讯云轻量应用服务器优惠购买攻略,怎么购买腾讯云优惠划算?

腾讯云轻量应用服务器&#xff08;Lighthouse&#xff09;是一款专为中小型企业和个人开发者打造的云服务器产品。它具备简单易用、成本低廉和高性能等特点&#xff0c;为用户提供了便捷高效的云服务器解决方案。 腾讯云轻量应用服务器采用了简单直观的图形化界面&#xff0c;…

linux grub2 不引导修复 grub2-install:error:/usr/lib/grub/x86_64-efi/modinfo.sh

系统部署在物理机上&#xff0c;开机后一直pxe不进系统&#xff0c;怀疑GRUB丢失。 查看bios 里 采用uefi 启动方式&#xff0c; 无硬盘系统引导选项&#xff0c; 且BMC设置为硬盘永久启动也无效。 挂载光驱ISO进入救援模式,sda为系统盘&#xff0c;重装grub报错 grub2-inst…

ProtoBuf的学习和使用(C++)

ProtoBuf的学习和使用---C ⼀、初识ProtoBuf序列化和反序列化的概念ProtoBuf是什么?ProtoBuf工作特点 二、主要学习思路三、快速上手四、proto3语法详解1.字段规则2.消息类型的定义与使⽤实际操练 3.enum枚举类型enum注意事项enum实操 4.Any类型Any类型实操 5.oneof类型oneof类…

FTP网络问题排查

Linux探测路径MTU&#xff1a; ping大包&#xff1a; [test]$ ifconfig eth0: flags4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1280 [test]$ ping -M do -s 1252 172.18.98.3 PING 172.18.98.3 (172.18.98.3) 1252(1280) bytes of data. 1260 bytes from 172.18.98.3: …