C++类和对象,初见类

news2024/11/17 7:35:55

坚持看完,结尾有思维导图总结

这里写目录标题

  • C语言和 C++ 的区别
  • 类的定义
    • 类的初认识
    • 类的内容
    • 访问限定符
    • 类的作用域
  • 类的实例化
  • 类中的 this 指针
  • 总结

C语言和 C++ 的区别

C++ 的祖师爷除了在 C语言的基础上化简了一些复杂操作
更为重要的是,两个语言实现的过程是不一样的
C 语言是一种面向过程的语言,而 C++ 是一种面向对象的语言

如果是洗衣服
C 语言会这样洗
那盆子,放水,放衣服,加洗衣粉,手搓,晾干
而 C++ 会先分析有哪些对象

会有 人 衣服 洗衣机 洗衣粉
通过这些对象的交互完成洗衣服
人只要做把衣服放进洗衣机,加洗衣粉,打开洗衣机就可以
不需要关注衣服是怎么洗的

类的定义

类的初认识

上面我们如果是用 C 语言来写,就要定义一个盆子,然后放水是一个函数
放衣服是一个函数,加洗衣粉是一个函数,手搓衣服是一个函数,晾干是一个函数
然后一步步地走

但是 C++ 不同
他会把人 衣服 洗衣粉 洗衣机分别定义成一个个的类
人有哪些特性,功能,归到人这个类里面
衣服有哪些特性功能,归到衣服这个类中
洗衣机有哪些特性功能,归到洗衣机这个类中

我们很自然地联想到,一个自定义的类型,在 C语言中我们常使用结构体定义
struct 但是 在 C 语言里面,结构体内部并不支持函数

然而在 C++ 中,我们可以在结构体里头写函数了 ,这样于 c语言结构体类似但是不同的东西 我们把他叫做类
类的定义是这样的

class Name
{
//成员函数和成员变量
};// 注意分号

类的内容

类中的内容可以分成两类,一类是 成员变量 , 一类是成员函数
如果我们认识一个人,我们能知道这个人是谁,叫什么名字,是什么性别


class Person
{
//成员函数
public:
	void personinfo()
	{
		cout << _name << ' ' << _age << ' ' << _sex << endl;
	}
// 成员变量
private:
	char* _name;
	int _age;
	char* _sex;
};

这里的实现是声明和定义放在一起的
有时候,类中声明和函数放在一起的情况,编译器可能会把成员函数看做是内联函数

如果我们想要把声明和实现分离
在这里插入图片描述
在这里插入图片描述

在实现的位置,一个是不要忘记头文件的应用
在引用完头文件后,要说明实现的函数属于哪一个类,这里是类的作用域的问题
声明则放在类里面

访问限定符

有一件奇怪的事情
为什么成员变量前面要加上 private 而 成员函数前面要加上 public
这里就设计到访问限定符的问题

我们都用过洗衣机,也大概都知道怎么用洗衣机
就那几个按钮的事情对吧
我们不会为了使用洗衣机去研究洗衣机的结构

类也是这样,除了设计者
使用的人只要会用成员函数就可以了,并不会去关注成员变量有哪些

public 变式公共的 ,能够为外界调用
private 表示私人,就是不能被类之外的操作访问,但是类内的函数(成员函数)是可以访问的

那我们就能够调用 public 的函数来间接按照特定的方式访问 private 的成员

还有 一个访问限定符 叫 protected 因为是 简略说明 ,所以暂时不介绍

其中需要注意的是
class的默认访问权限为private,struct为public(因为struct要兼容C)
访问权限作用域从该访问限定符出现的位置开始直到下一个访问限定符出现时为止, 如果后面没有访问限定符,作用域就到 } 即类结束。

而这种通过访问权限,隐藏类的成员变量结构,显示类的访问方式的做法,就是封装

就好像是洗衣机内部被洗衣机外壳包起来,我们看不到内部结构的方式,就是封装
而封装是面向对象 的三大特性之一

类的作用域

之前在初识C++ 中,我们说为了防止多个程序员使用同名变量,同名函数
我们可以用不同的作用域,来圈定哪些变量属于程序员 A ,哪些变量属于程序员 B

而当我们定义一个类的时候,会自动生成一个类的作用域
不同的类是可以使用同名函数和变量的,使用类的作用域能够很好地应对这种情况
因为成员变量已经在类里面了不用再表明属于哪一个类
而当函数声明和实现分离时,在实现函数的时候,必须指明属于哪一个类,防止实现的混淆

类的实例化

前面我们解决的是类的声明的问题
类的声明,就好像把动物分成一个个种类,比如像熊猫,这是一类动物
但是其中的每一只熊猫都有自己的特征,自己的名字等

这种就叫做实例化
在计算机中,我们说类有 成员函数,成员变量,都是类的声明
而在使用中调用的类,才是类的实例化
我们可以简单理解为为类开空间就是类的实例化

既然为类开空间了,那就说明有空间大小
空间大小是如何计算呢?
尤其是一个类中有成员函数,整个类大大小计算更加奇怪了

#define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>
using namespace std;

class Date
{
public:
	void DateInit(Date& date, int year = 1, int month = 1, int day = 1);
private:
	int _year;
	int _month;
	int _day;
};

void Date::DateInit(Date& date,int year,int month,int day)
{
	date._year = year;
	date._day = day;
	date._month = month;
}

int main()
{
	Date d1;
	d1.DateInit(d1,2023,2,14);
	cout << sizeof(d1) << endl;
	return 0;
}

我定义了一个日期类,其中内部成员有年月日
通过计算大小,发现
在这里插入图片描述
计算大小是 12 ,说明 ---- 内部只给内部成员开辟了空间,但是没有给函数开辟空间
那函数的空间开辟到哪里去了呢?

实际上,类的空间开辟,是这样的
事实上,每一个成员虽然不同,但是调用的成员函数传递的参数都是一样的
也就是说,对于类的成员函数来说
每个类只要把成员函数需要的参数传给我就可以了

成员函数是不管你是哪一个成员
我们在观察一下对应的汇编代码
在这里插入图片描述
可以看到调用的是同一个函数
既然编译器都帮你对应的函数调用转换了,和调用一个普通函数差不多
又何必开辟空间储存对应的函数指针甚至是整个函数栈帧呢,答案是没有必要浪费这个空间

但是要注意的是,如果实例化一个空类(一个没有内容的类)
他的空间大小是 1 ,用来占位

类中的 this 指针

在类的成员函数中,我们可以这样写初始化函数

#define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>

using namespace std;

class Date
{
public:
	void Init(int year,int month,int day)
	{
		_year = year;
		_month = month;
		_day = day;
	}
private:
	int _year;
	int _month;
	int _day;
};

int main()
{
	Date d1;
	d1.Init(2023,2,16);
	return 0;
}

在调试中我们能够看到 d1 被初始化为 2023 2 16
在这里插入图片描述

但是传参中,我可是没有传递任何与 d1 相关的参数
只是之前的 d1.Init 指定了一下而已
成员函数是怎么样找到 d1 然后将 d1 初始化的呢?

实际上,编译器会自动帮我们传递一个 this 指针 的参数交给成员函数
这个 this 指针始终指向 调用这个成员函数的对象

比如我们 d1.Init 调用 Init 成员函数
编译器会把 this 指针传参
然后对应的成员 变成 this->成员 的解引用
在这里插入图片描述
但是我们不能直接把 this 指针当成一个参数写在函数上面
如果这样写,编译器会传递自己在函数自动传参的 this 指针
但是 用户写的 this 这个形参的坑就没有人填了,导致形参数量过多,出现问题

总结

在这里插入图片描述

希望大家看完,能够有所
如果有错误,请指出我一定虚心改正
动动小手点赞
鼓励我输出更加优质的内容

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

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

相关文章

智慧校园源码:电子班牌,支持手机移动端以及web端对班牌设备的管控

▶ 智慧校园系统有源码&#xff0c;有演示&#xff01; (电子班牌&#xff09;设备管理&#xff1a; 1、 管理员查看全校电子班牌设备信息&#xff1a;含有&#xff08;班级信息、软件版本、设备型号、开关机信息、班牌截屏信息、教室编号、设备ID、设备描述、在线状态、离线状…

MySQL数据库调优————创建索引的原则和索引失效及解决方案

创建索引的原则 建议创建索引的场景 select语句&#xff0c;频繁作为where条件的字段update/delete语句的where条件需要分组、排序的字段distinct所使用的字段字段的值有唯一性约束对于多表查询&#xff0c;联接字段应创建索引&#xff0c;且类型无比保持一致 避免隐式转换 …

技研智联云原生容器化平台实践

作者简介&#xff1a;郑建林&#xff0c;现任深圳市技研智联科技有限公司架构师&#xff0c;技术负责人。多年物联网及金融行业经验&#xff0c;对云计算、区块链、大数据等领域有较深入研究及应用。现主要从事 PaaS 平台建设&#xff0c;为公司各业务产品线提供平台底座如技术…

如何将Python项目部署到新电脑上运行?

如何将Python项目部署到新电脑上运行&#xff1f; 在工作中&#xff0c;可能需要在新服务器上部署项目代码&#xff0c;例如新增服务器、把测试环境的代码部署到生产环境等。 在生活中&#xff0c;也会遇到换新电脑&#xff0c;需要将自己在旧电脑上写的&#xff08;项目&…

Linux内存分区(swap)

目录 1、使用物理分区创建内存交换分区 2、使用文件创建内存交换文件 当硬件的设备资源充足的话&#xff0c;那么swap是不会被我们的系统所使用到的&#xff0c;所以swap会被利用到的时刻通常就是物理内存不足的情况 我们知道CPU所读取的数据都来自于内存&#xff0c;那么当…

硬件系统工程师宝典(7)-----信号完整性分析中的时序设计

各位同学大家好&#xff0c;欢迎继续做客电子工程学习圈&#xff0c;今天我们继续来讲这本书&#xff0c;硬件系统工程师宝典。 上篇我们说到信号的串扰以及减小串扰的方法。今天我们来看看信号的时序设计需要考虑什么&#xff1f; 信号的时序设计 信号的时序要求就是数据信…

【JavaGuide面试总结】Redis篇·上

【JavaGuide面试总结】Redis篇上1.Redis 除了做缓存&#xff0c;还能做什么&#xff1f;2.Redis 可以做消息队列么&#xff1f;3.如何基于 Redis 实现分布式锁&#xff1f;4.Redis 常用的数据结构有哪些&#xff1f;5.String 的应用场景有哪些&#xff1f;6.String 还是 Hash 存…

【AI/NLP】InstructGPT数据标注问题

文章目录1 背景介绍2 标记员筛选2.1 标记员筛选标准3 数据集及其标注3.1 预训练3.2 微调3.2.1 SFT-demonstration data3.2.2 RM-comparison data3.3 数据集大小4 模型实现1 背景介绍 ChatGPT的训练过程与InstructGPT相近&#xff0c;大致分为三步&#xff1a; SFT&#xff1a…

基金详细介绍

投资回报率 利润 / 投资总额&#xff08;第一次投资回报率 5%&#xff09; 关注南方理财 60 天债券 B&#xff08;202306&#xff09;万元收益 50—60 元 购基七步曲&#xff1a; 风险测试基本知识交易指南查看业绩了解评级在线下单赎回 基金类型&#xff1a; 积极成长型基金…

svg转png

svg转png写了一个spring boot项目&#xff0c;支持传入svg文件转出png图片&#xff0c;并且自定义转出png的宽和高。主要代码如下&#xff1a;所需依赖如下&#xff1a;演示如下&#xff1a;首先&#xff0c;运行项目使用接口调用工具调用接口发送请求&#xff0c;提取文件1000…

日本机载激光雷达测深进展(一)日本启动测量90%沿岸水深项目

海洋地图项目利用航空测深绘制日本90%沿海20m以浅区域&#xff0c;是日本海道协会&#xff08;JHA&#xff09;和日本财团的一个联合项目。 迄今为止&#xff0c;只有不到2%的日本沿海水域得到了测绘&#xff0c;严重拖累了在海洋事故、防灾减灾、篮碳以及生物多样性保护等领域…

数据结构——第二章 线性表(1)——顺序结构

线性表1. 线性表1.1 线性表的定义1.1.1 访问型操作1.1.2 加工型操作1.2 线性表的顺序存储结构1.2.1 定义顺序表数据类型方法11.2.2 定义顺序表数据类型方法21.3 顺序表的基本操作实现1.3.1 顺序表的初始化操作1.3.2 顺序表的插入操作1.3.3 顺序表的删除操作1.3.4 顺序表的更新操…

Windows环境下使用Pycharm运行sh文件

博主在调试一些程序时&#xff0c;时常遇到 .sh文件&#xff0c;这是Linux中的shell脚本文件&#xff0c;那么这种文件在windows下如何运行呢&#xff0c;其实我们可以通过git来实现&#xff0c;接下来看我操作。 首先我们需要安装Git&#xff0c;关于其安装过程可以参考博主这…

wholeaked:一款能够追责数据泄露的文件共享工具

关于wholeaked wholeaked是一款功能强大的文件共享工具&#xff0c;该工具基于go语言开发&#xff0c;可以帮助广大系统管理员和安全研究人员在组织发生数据泄露的时候&#xff0c;迅速找出数据泄露的“始作俑者”。 wholeaked可以获取被共享的文件信息以及接收人列表&#x…

【云计算自学路线】

云计算包含的技术内容和涉及的方向比较多&#xff0c;一定要进行系统化的学习才能更好的掌握这门技术。 云计算作为互联网新技术领域&#xff0c;现阶段也是出于高速发展期&#xff0c;想学习加入云计算行业的小伙伴可以抓紧机会了&#xff0c;跟着小课一起来了解云计算以及它…

【PTA Advanced】1146 Topological Order(C++)

目录 题目 Input Specification: Output Specification: Sample Input: Sample Output: 思路 C 知识UP 代码 题目 This is a problem given in the Graduate Entrance Exam in 2018: Which of the following is NOT a topological order obtained from the given dire…

佳能镜头EOS系统EF协议逆向工程(四)常用指令

目录 EOS5000&#xff08;基础协议&#xff09; AE*记忆键 物镜38-76焦距76mm的帧值&#xff08;手动焦距&#xff09; 帧操作和解码命令 指令0x0A:请求物镜可用 指令0xA0、B0、B2、90和F0&#xff1a;光学特性和AF状态 指令0x80-0A:请求物镜的物理特性 指令0xC2&#…

(考研湖科大教书匠计算机网络)第四章网络层-第四节:IP数据报的发送和转发过程

获取pdf&#xff1a;密码7281专栏目录首页&#xff1a;【专栏必读】考研湖科大教书匠计算机网络笔记导航 文章目录一&#xff1a;概述二&#xff1a;举例三&#xff1a;路由器可以隔离广播域本节对应视频如下 【计算机网络微课堂&#xff08;有字幕无背景音乐版&#xff09;】&…

文华财经期货策略高胜率顶底反转指标公式,短线操盘量化CTA主图K线指标

​期货指标公式不是交易的圣杯&#xff0c;也不是期货亏损后的救命稻草。请理性运用指标公式&#xff0c;独立决策&#xff0c;盈亏自负。 什么是多头趋势行情&#xff1f; 多头趋势行情指的是市场单边多头行情。具体表现为上涨过程中出现连续上涨的高点与低点&#xff0c;只要…

3.4 ISIS和OSPF之间路由引入

实验目的掌握在IS-IS中引入OSPF路由的方法掌握在OSPF中引入IS-IS路由的方法实验拓扑ISIS和OSPF之间路由引入实验拓扑如图3-3所示: 图3-3:ISIS和OSPF之间路由引入 实验步骤IP地址的配置R1的配置 <Huawei>system-view [Huawei]undo info-center enable