类和对象的学习总结(一)

面向对象和面向过程编程初步认识

C语言是面向过程的,关注过程(分析求解问题的步骤)
例如:外卖,关注点菜,接单,送单等
C++是面向对象的,关注对象,把一件事拆分成不同的对象,对每个对象进行分别管理,依靠对象之间的交互完成。例如:外卖,关注用户,骑手,商家三个核心对象,三者交互完成这件事

文章目录

  • 类的引入
  • 访问限定符
  • 类域
  • 类的大小(sizeof)
  • this指针
  • 构造函数
  • 析构函数
  • 拷贝构造

类的引入

在C语言中有结构体(struct)的概念,C++是兼容了struct在C语言中的用法,同时增加了结构体中实现函数功能,为了区别结构体C++引入了新的关键字class——类,
类中的内容是类的成员,变量叫做成员变量或类的属性,函数叫做成员函数或类的方法
C++中类和结构体基本上的用法是相同的
注意:
变量的定义是指开空间,类中的成员变量都是声明,对象实例化时,才是定义

class Date {int _year;int _month;int _day;
};

这是一个简单的日期类
也可以写作

struct Date2 {int _year;int _month;int _day;
};

在这里插入图片描述
上述代码访问d1._year 报错了,d2._year却没有
这就要说到访问限定符了

访问限定符

C++有三种访问限定符,public,private,protected
就是限制对类中的成员进行访问,
public(公有)类里面和外面都可以使用
private(私有)只有类里面可以使用,

protected 先不考虑
class 和 struct 的主要的区别就在这里:
class 不加访问限定符就默认表示私有
struct 默认表示公有

这就是为什么上述代码报错,加上public限定符修饰就可以在外面访问成员变量了
在这里插入图片描述
加上这样的修饰就可以访问了,

public:这样就是修饰为公有,范围到下一个访问限定符或者结尾。
一般情况下成员变量都是私有的,不希望直接访问或修改成员变量,而是通过函数调用来修改

类域

我们想要对类中的函数进行声明定义分离,该如何操作呢
看下面代码

class Date {public:void print();int _year;int _month;int _day;
};void print()
{_year = 1, _month = 1, _day = 1;cout << _year << '-' << _month << '-' << _day << endl;
}int main()
{Date d1;d1.print();return 0;
}

上述打印功能函数会直接报错,这里就要了解类域

类定义了一个新的作用域,类的所有成员都在类的作用域中,类外定义成员时需要使用 :: 操作
正确代码应该是


void Date::print()
{_year = 1, _month = 1, _day = 1;cout << _year << '-' << _month << '-' << _day << endl;
}

这样就可以了

类的大小(sizeof)

类中成员函数的功能都是一样的,所以类里面只存成员变量,成员函数存在一个公共的区域(代码段),每个对象里面都放成员函数太冗余了(每创建一个类,都为函数开辟空间太浪费)
没有成员变量的类大小为 1byte,为了表示这个对象存在过。

遵循结构体内存对齐规则(空间换时间,提高效率)

this指针

上述打印日期时,我们没有传入参数,但是能打印出结果,

class Date {public://构造函数初始化,先不用管Date(int year = 1, int month = 1, int day = 1){_year = year;_month = month;_day = day;}void print(){cout << this->_year << '-' << _month << '-' << _day << endl;}int _year;int _month;int _day;
};int main()
{Date d1(2005, 8, 27);Date d2(2004, 8, 27);d1.print();d2.print();return 0;
}

运行结果如下
在这里插入图片描述
可以通过this指针来找到d1中的成员变量,this指针编译时编译器会自动不上,不写也可以,但注意的时,this在函数中可以使用,不能传参。this指针相当于 &d1,this指针是形参,对&d1的拷贝,存在于栈区

面向对象的三大特性:封装,继承,多态
封装的本质是一种管控,把数据和方法都放在类里面,通过访问限定符对成员变量进行限制,也更便于维护

先来看封装

构造函数

	Date(int year = 1, int month = 1, int day = 1){_year = year;_month = month;_day = day;}

上述代码中,这个函数可以对日期类成员变量进行初始化。
这就是一个构造函数,主要任务是初始化对象。
构造函数有以下几个特性
1、函数名与类名相同
2、无返回值
3、对象实例化时自动调用,不需要自己操作
'4、构造函数可以重载
5、如果没有写构造函数,构造函数可以自动生成一个构造函数,但是它不做任何事情
6、编译器自动生成的构造函数(内置类型不做任何处理,自定义类型去调用它的构造函数)

无参数,全缺省,自动生成的都是默认构造函数,一般建议提供全缺省构造函数
绝大多数情况下,要自己写构造函数,只要写了一个,编译器就不会默认生成了(一般构造函数写成全缺省的最方便

析构函数

析构函数:清理资源
~类名()
1、没有返回值,没有参数
2、函数结束自动执行析构函数,清理资源
3、析构函数也可以默认生成,功能和构造函数类似。
析构函数只有一个,不能被重载

拷贝构造

拷贝构造函数:
传参要传引用,否则会无穷递归(传参本身就会产生形参,形参又要调用拷贝构造函数,从而形成无限递归)
拷贝构造是默认成员函数,如果没有显示定义,会默认生成拷贝构造函数
内值类型:浅拷贝(值拷贝)
自定义类型:调用拷贝构造函数
成员变量中有数组指针,就需要进行深拷贝
默认生成的拷贝构造不能实现深拷贝

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java之面向对象2笔记

1 接口(interface) 1.1 概述 接口&#xff08;Interface&#xff09;在计算机科学中&#xff0c;特别是在面向对象编程&#xff08;OOP&#xff09;中&#xff0c;是一个重要的概念。它定义了一组方法的规范&#xff0c;但没有实现这些方法的具体代码。接口的主要目的是确保类…

[240610] 5 种 Non-Posix Shell 在 x-cmd 上的支持 | Perl 发布 5.40.0

目录 [TOC](目录)5 种非 Posix SHell - nushell,fish,xonsh,csh,pwshnushellfishxonshcshpwsh Perl 发布 5.40.0核心增强安全性不兼容的变化弃用性能提升模块和编译指示文档诊断配置和编译平台支持内部变化选定的错误修复已知问题先前版本的勘误表致谢报告错误致谢另请参阅 5 种…

SOA的设计模式_3.微服务模式

SOA的架构中&#xff0c;复杂的ESB企业服务总线依然处于非常重要的位置&#xff0c;整个系统的架构并没有实现完全的组件化以及面向服务&#xff0c;它的学习和使用门槛依然偏高。而微服务不再强调传统SOA架构里面比较重的ESB企业服务总线&#xff0c;同时SOA的思想进入到单个业…

Linux系统下 安装 Nginx

一、下载Nginx安装包 压缩包下载地址&#xff1a;nginx: download 服务器有外网&#xff0c;可直接使用命令下载 wget -c https://nginx.org/download/nginx-1.24.0.tar.gz 二、安装Nginx 1、解压 tar -zxvf nginx-1.24.0.tar.gz 2、安装Nginx所需依赖 yum install -y gc…

整数反转(leetcode)

题目&#xff1a; 给你一个 32 位的有符号整数 x &#xff0c;返回将 x 中的数字部分反转后的结果。 如果反转后整数超过 32 位的有符号整数的范围 [−231, 231 − 1] &#xff0c;就返回 0。 假设环境不允许存储 64 位整数&#xff08;有符号或无符号&#xff09;。 示例 1&…

SLAM小题目

1、最小二乘题目&#xff1a; 假设有三个WIFI热点&#xff0c;位置分别在(x1,y1), (x2,y2), (x3,y3), 移动端测量到每一个热点的距离L1,L2和L3&#xff0c;要求解移动端的位置. #include <iostream> #include <vector> #include <cmath> class Point { pub…

监听DB配置变更之go-broadcast简单实现

文章目录 1. 前言2. 分析3. 实现4. 问题5. 小结6. 参考 1. 前言 之前遇到一个需求&#xff0c;因为配置的查找是基于db的&#xff0c;而db的更改却无法实时通知到具体利用到这条数据的使用方&#xff0c;为了实现db数据变动时&#xff0c;能够尽快让使用方知道这条数据发生了变…

设计模式七大原则-单一职责原则SingleResponsibility

七大原则是在设计“设计模式”的时候需要用到的原则&#xff0c;它们的存在是为了保证设计模式达到以下几种目的&#xff1a; 1.代码重用性 2.可读性 3.可拓展性 4.可靠性&#xff08;增加新的功能后&#xff0c;对原来的功能没有影响&#xff09; 5.使程序呈现高内聚、低耦合的…

3、线性代数

1、矩阵转置 A[i,j]A[j,i] 2、对称矩阵 &#xff1a;A转置A [0,2,3] [2 1 5] [3,5,1] 3、三维矩阵 求和 axis0 两个矩阵相加 axis1 两个向量相加 &#xff0c;axis2 向量内部相加 keepdimsTrue 求和后维度保持不变 4、cumsum累加求和 5、torch.mm() 或 torch.bmm() 【矩…

vivado HW_SERVER

HW_服务器 描述 硬件服务器管理到硬件目标的连接&#xff0c;例如硬件 板&#xff0c;包含一个或多个Xilinx FPGA设备的JTAG链&#xff0c;用于 编程和调试您的FPGA设计。 使用open_hw命令打开硬件管理器时&#xff0c;可以连接到 硬件服务器&#xff0c;本地或远程&#xff0c…

支持YUV和RGB格式两路视频同时播放

1.头文件&#xff1a; sdlqtrgb.h #pragma once #include <QtWidgets/QWidget> #include "ui_sdlqtrgb.h" #include <thread> class SdlQtRGB : public QWidget {Q_OBJECTpublic:SdlQtRGB(QWidget* parent Q_NULLPTR);~SdlQtRGB(){is_exit_ true;//等…

使用EFCore和Linq查询语句封装复杂的查询结果

这里举一个例子&#xff0c;用到了三个实体类&#xff0c;分别是 [Table("t_user")] public class User {[Key]public long Id { get; set; }public string UserName { get; set; }public string Password { get; set; }public string Email { get; set; }public Li…

Gradle和Maven都是广泛使用的项目自动化构建工具(二)

Gradle和Maven都是广泛使用的项目自动化构建工具&#xff0c;但它们在多个方面存在差异。以下是关于Gradle和Maven的详细对比&#xff1a; 一、构建脚本语言 Maven&#xff1a;使用XML作为构建脚本语言。XML的语法较为繁琐&#xff0c;不够灵活&#xff0c;对于复杂的构建逻辑…

十大排序

本文将以「 通俗易懂」的方式来描述排序的基本实现。 &#x1f9d1;‍&#x1f4bb;阅读本文前&#xff0c;需要一点点编程基础和一点点数据结构知识 本文的所有代码以cpp实现 文章目录 排序的定义 插入排序 ⭐ &#x1f9d0;算法描述 &#x1f496;具体实现 &#x1f…

LabVIEW硬件与仿真双模式设计液压系统

在实际项目中&#xff0c;结合LabVIEW与液压运动控制器&#xff0c;通过设计两种运行方式&#xff1a;硬件运行和仿真运行&#xff0c;使得系统既能进行实际操作又能进行仿真测试。此设计不仅方便了开发调试&#xff0c;也为教学培训和展示提供了极大的便利。本文将从项目背景、…

OBS与直播伴侣是什么关系,是否需要并用?

OBS相较于直播伴侣&#xff0c;提供了更为丰富和灵活的直播功能。OBS是一个免费开源的视频录制和视频实时交流软件&#xff0c;具有以下优势&#xff1a; 优化直播画面&#xff1a;OBS提供了包括卡通头像、卡通人物&#xff0c;以及美颜、特效、滤镜等多种功能&#xff0c;可以…

力扣2300.咒语和药水的成功对数

力扣2300.咒语和药水的成功对数 排序 二分 对于能整除的数 -1以后一起处理可以在原数组直接修改 class Solution {public:vector<int> successfulPairs(vector<int>& spells, vector<int>& potions, long long success) {sort(potions.begin(),p…

【机器学习】基于卷积LSTM的视频预测

1. 引言 1.1 LSTM是什么 LSTM&#xff08;Long Short-Term Memory&#xff09;是一种特殊的循环神经网络&#xff08;RNN&#xff09;变体&#xff0c;旨在解决传统RNN在处理长序列数据时遇到的梯度消失和梯度爆炸问题。LSTM通过引入门控机制和细胞状态的概念&#xff0c;使得…

QPS,平均时延和并发数

我们当前有两个服务A和B&#xff0c;想要知道哪个服务的性能更好&#xff0c;该用什么指标来衡量呢&#xff1f; 1. 单次请求时延 一种最简单的方法就是使用同一请求体同时请求两个服务&#xff0c;性能越好的服务时延越短&#xff0c;即 R T 返回结果的时刻 − 发送请求的…

【Python教程】4-字符串、列表、字典、元组与集合操作

在整理自己的笔记的时候发现了当年学习python时候整理的笔记&#xff0c;稍微整理一下&#xff0c;分享出来&#xff0c;方便记录和查看吧。个人觉得如果想简单了解一名语言或者技术&#xff0c;最简单的方式就是通过菜鸟教程去学习一下。今后会从python开始重新更新&#xff0…