C++类和对象上篇

在这里插入图片描述

🐇

🔥博客主页: 云曦
📋系列专栏:[C++]

💨路漫漫其修远兮 吾将而求索
💛 感谢大家👍点赞 😋关注📝评论

文章目录

  • 📙前言
  • 📙1、面向过程与面向对象的初步认识
  • 📙2、类的引入
  • 📙3、类的定义
  • 📙4、类的访问限定符
  • 📙5、类的作用域
  • 📙6、类的实例化
  • 📙7、类的对象模型
    • 📋7.1、类对象的存储方式
  • 📙8、this指针
    • 📋8.1、this指针的引出
    • 📋8.2、this指针的特性

📙前言

哈喽!大家好呀,咱们又见面了。
上期我们也是触摸到了C++的大门,那么这期我们就要开始慢慢的推开这扇大门了。也希望和大家一起坚持学习下去。

📙1、面向过程与面向对象的初步认识

  • 我们之前所学的C语言是面向过程的这么一个语言。C语言关注的是过程,分析出解决问题的步骤,然后逐步执行解决问题。
  • 就比如我们在手洗衣服时,会有这些步骤:
    在这里插入图片描述在这里插入图片描述
  • C++是基于面向对象的,关注的是对象,将一件事划分成不同对象,靠和对象之间的交互完成任务。
    在这里插入图片描述

  • 整个过程就四个对象:人、洗衣机、衣服洗衣服。

  • 人倒入洗衣服和衣服,启动洗衣机,洗衣机就会完成该完成的步骤。

  • 人、洗衣机、衣服、洗衣服四个过程之间是相互交互的,人不关心洗衣机是如何洗衣服、甩干的。
    在这里插入图片描述

📙2、类的引入

  • 在C语言中我们定义一个栈是这样定义的:
struct Stack
{
	int* a;
	int top;
	int capacity;
};
//函数只能写在外面
void StackInit(Stack* st)
{
	//...
}

  • 现在C++里写栈时,会发现在struct里面是可以定义函数的。
struct Stack
{
	int* a;
	int top;
	int capacity;

	void Init();
};
  • 这其实就是面向对象:C++把struct叫作类,因为C++包含C的百分之80/90,所以在C++里struct包含了C语言里的所有用法,且C++还对struct进行了升级。但在C++中,定义自定义类型通常都是用class定义的,极少数情况用struct定义。

📙3、类的定义

class className
{
	//类体:由成员函数和成员变量组成
};
  • class 为定义类的关键字、className 是这个类的名字、{}为类的主体、注意:{}后面的;不能省略。
  • 类体中的内容称为类的成员,类里的变量叫作成员变量、类里的函数叫作成员函数
  • 类定义的两种方式:
  1. 声明和定义都放在类内,但需要注意:在类里定义的成员函数有可能会被编译器当作内联函数处理。
//人
class Person
{
public:
	//打印信息
	void print()
	{
		cout << (*_name) << "-" << (*_sex) << "-" << _age << endl;
	}

private:
	char* _name;//名字
	char* _sex;//性别
	int _age;//年龄
};

2.声明和定义分离,声明在.h文件里、定义在.cpp文件里。

  • 注意:cpp文件里定义的函数需要加 类名::
    在这里插入图片描述
    在这里插入图片描述
  • 一般情况下都是用第二种方式。
  • 成员变量的命名规则(建议)
class Date
{
public:
	void Init(int year, int month, int day)
	{
		//这样你怎么分清楚哪个是类的成员变量,哪个是形参?
		year = year;
		month = month;
		day = day;
	}

private:
	int year;
	int month;
	int day;
};
  • 所以建议大家在写类的成员变量时,在前面后后面加上_,便于区分。
class Date
{
public:
	void Init(int year, int month, int day)
	{
		_year = year;
		_month = month;
		_day = day;
	}

private:
	int _year;
	int _month;
	int _day;
};

📙4、类的访问限定符

  • C++实现封装的方式:用类将对象的属性(成员变量)和方法结合在一起,通过访问权限的方式提供接口给外部的用户使用。
    在这里插入图片描述
  1. 公有:类内可以访问,类外也可以访问。
  2. 保护:类内可以访问,类外不可以访问。
  3. 私有:类内可以访问,类外不可以访问。
  • 在前期,我们就把保护和私有两个权限都当成一样的作用来使用。保护权限要到继承篇才好具体说明。
  • class和struct的区别:
  1. class的默认访问权限是私有的,而struct的默认访问权限是公有的。
  2. struct包含了C语言struct的功能。

📙5、类的作用域

  • 类的作用域就是定义类的{}里面为类的作用域。
class Date
{
//{}内,为类的作用域
private:
	int _year;
	int _month;
	int _day;
};
//{}外,不是类的作用域
  • 注意:在类外定义成员时,要用::域作用限定符来指定属于哪个类的。

class Date
{
public:
	void Init(int year, int month, int day);

private:
	int _year;
	int _month;
	int _day;
};

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

📙6、类的实例化

class Date
{
public:
	void Init(int year, int month, int day);

private:
	int _year;
	int _month;
	int _day;
};
  • 大家想一下,类内的成员变量是声明还是定义呢?— 是声明
  • 那么定义在哪呢?
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()
{
	//这样就是类的实例化
	//C++把d1叫作对象
	Date d1;

	return 0;
}
  • 可以这样理解:
    在这里插入图片描述
  • 一个类可以有很多个对象,同理一张图纸也可以盖出好几栋一样的房子。
    在这里插入图片描述
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;
	Date d2;
	Date d3;
	Date d4;
	Date d5;

	return 0;
}

📙7、类的对象模型

📋7.1、类对象的存储方式

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

private:
	int _year;
	int _month;
	int _day;
};
  • 大家猜猜上面类的大小是多少?
  • —12字节
    在这里插入图片描述
  • C++类的大小和C语言的struct定义类型的大小的计算方式是一样的(都是要内存对齐)。
  • 空间是可以重复利用的,所以成员函数不在类开辟的空间内,而是在C++的一个公共代码区内放置成员函数,调用时会去这个公共的代码区寻找函数。
  • 如果,成员函数也和成员变量一样开辟空间,那么实例化多个对象时也就开辟了多个一样的函数空间,这样就会造成空间上的浪费。
//空类又是多少字节呢?
class Stack
{};
  • 也许大家会认为空类没有开辟空间就是0字节。其实不是,为了证明这个空类存在过C++给空类安排了1字节的空间,来证明这个类存在过。
    在这里插入图片描述

📙8、this指针

📋8.1、this指针的引出

#include<iostream>
using namespace std;

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

	void Print()
	{
		cout << _year << "-" << _month << "-" << _day << endl;
	}

private:
	int _year;
	int _month;
	int _day;
};

int main()
{
	Date d1;
	Date d2;
	d1.Init(2024, 5, 1);
	d2.Init(2024, 5, 5);

	d1.Print();
	d2.Print();

	return 0;
}
  • 对上述类有一个问题:
  • 上面代码中的函数Init和Print是怎么知道操作的对象是d1,而不是d2的呢?
  • C++中引入了this指针解决了这个问题,即:C++编译器给每个非静态的成员函数增加了一个隐藏的指针参数,让指针指向当前对象(函数运行时调用该函数的对象),在函数体中所有成员变量的访问,都是通过这个指针访问的。只不过对用户是隐藏起来的,用户不需要传递,编译器会自动完成操作。

📋8.2、this指针的特性

  1. this指针的类型:类类型* const,即,成员函数内不能给this指针赋值。
Date* const this
  1. 只能在类内使用。
  2. this指针本质成员函数的形参,但对象调用成员函数时,将对象的地址作为实参传递给this形参。所以对象内不会给this指针开辟空间。
#include<iostream>
using namespace std;

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

	//语法上的转换 void Print() ==> void Print(Date* this)
	void Print()
	{
		cout << _year << "-" << _month << "-" << _day << endl;
	}

private:
	int _year;
	int _month;
	int _day;
};

int main()
{

	Date d1;
	Date d2;
	d1.Init(2024, 5, 1);
	d2.Init(2024, 5, 5);

	d1.Print();//语法上的转换d1.Print(); ==> d1.Print(&d1);
	d2.Print();//d2.Print(); ==> d2.Print(&d2);

	return 0;
}
  1. this指针是成员函数第一个隐含的指针形参,由编译器通过寄存器自动传递,不需要用户传递。
  • this的一些细则:
  1. this不能显示传实参和写形参
    在这里插入图片描述
  2. this可以在成员函数内显示写this。
    在这里插入图片描述
    至于为什么可以在成员函数里显示写this指针呢,到类和对象中篇会给大家讲到。

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

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

相关文章

高扬程消防水泵在火灾中的关键作用/恒峰智慧科技

在火灾这一无情的灾难面前&#xff0c;每一秒都至关重要。而在这一分一秒的较量中&#xff0c;高扬程消防水泵无疑扮演着举足轻重的角色。它不仅是灭火战斗的得力助手&#xff0c;更是保障人民生命财产安全的守护神。 高扬程消防水泵&#xff0c;顾名思义&#xff0c;其扬程远超…

VOS系统录音文件REC转MP3,REC录音转WAV与WAV转MP3具体项目中实现方式,以及占用空间变化!

前面讲解了VOS3000系统的录音REC转MP3的安装步骤&#xff0c;不清楚的&#xff0c;可以移步这里查看&#xff1a;http://t.csdnimg.cn/OXNT9 或者 点击这里查看安装步骤&#xff0c;下面继续讲下他们的使用方法&#xff0c;以及实际项目中的运用&#xff0c;首先我们需要明确我…

vue本地打包预览

vue官网介绍 serve官网 1、项目打包 npm run build2、安装serve npm install -g serve3、在项目的 dist 文件运行命令行 serve5、运行结果如下 6、在浏览器打开 在浏览器打开 http://localhost:3000 或者 http://192.168.0.198:3000 就可以看到打包的东西了

【高质量】2024五一数学建模C题保奖思路+代码(后续会更新)

你的点赞收藏是我后续更新的最大动力&#xff01; 一定要点击文末的卡片&#xff0c;那是获取资料的入口&#xff01; 你是否在寻找数学建模比赛的突破点&#xff1f; 作为经验丰富的数学建模团队&#xff0c;我们将为你带来2024 年五一数学建模&#xff08;C题&#xff09;…

展会资讯 | 现场精彩回顾 阿尔泰科技参展2024第23届中国国际(西部)光电产业!

2024第23届中国国际&#xff08;西部&#xff09;光电产业博览会&#xff0c;在成都世纪城新国际会展中心圆满落幕&#xff01;来自各地的光电领域设备及材料厂商汇聚一堂&#xff0c;展示前沿技术及创新成果。 展会现场&#xff0c;来自全国各地的500余家企业就精密光学、信息…

电商技术揭秘文章合集(3)

相关系列文章 电商技术揭秘相关系列文章合集&#xff08;1&#xff09; 电商技术揭秘相关系列文章合集&#xff08;2&#xff09; 电商技术揭秘文章合集&#xff08;3&#xff09; 电商技术揭秘二十八&#xff1a;安全与合规性保障 电商技术揭秘二十九&#xff1a;电商法律…

esp32s3使用psram后音频播报不了的问题解决记录

idf.py menuconfig开启psram后会报错 提示需要打补丁&#xff1a; 根据提示切换到IDF_PATH目录&#xff0c;然后执行git apply %ADF_PATH%/ida_patches/idf5.0_freertos.patch打补丁。 再次编译提示如下错误&#xff1a; assert failed: spi_flash_disable_interrupts_cach…

电脑装了两个Win10系统,怎么修改其名称方便识别?

前言 有小伙伴在上一期的双系统教程上留言说怎么修改双系统引导时候显示的名称 不然看起来两个系统好像都没啥分别&#xff0c;如果是Windows10Windows11的方案还好说&#xff0c;但如果是两个Windows10或者是两个Windows11&#xff0c;有时候还真的很不好分辨。 万一想要启动…

OpenHarmony语言基础类库【@ohos.util (util工具函数)】

ohos.util (util工具函数) 该模块主要提供常用的工具函数&#xff0c;实现字符串编解码&#xff08;[TextEncoder])&#xff0c;[TextDecoder]&#xff09;、有理数运算&#xff08;[RationalNumber8]&#xff09;、缓冲区管理&#xff08;[LRUCache9]&#xff09;、范围判断&…

hdc不是内部或外部命令,也不是可运行的程序或批处理文件。【鸿蒙报错已解决】

文章目录 项目场景:问题描述原因分析:解决方案:此Bug解决方案总结Bug解决方案寄语项目场景: 最近遇到了这个问题,看到网上也有人在询问这个问题,实操了很多网上的解决方案发现并不能解决这个Bug,所以我在解决这个问题后,总结了自己和其他人的解决经验,进行了整理,写…

全网最强JavaWeb笔记 | 万字长文爆肝JavaWeb开发——day08数据库Mybatis入门

万字长文爆肝黑马程序员2023最新版JavaWeb教程。这套教程打破常规&#xff0c;不再局限于过时的老套JavaWeb技术&#xff0c;而是与时俱进&#xff0c;运用的都是企业中流行的前沿技术。笔者认真跟着这个教程&#xff0c;再一次认真学习一遍JavaWeb教程&#xff0c;温故而知新&…

latex+vscode一直报错,配置文件json和环境变脸配置

1、json配置文件 {"latex-workshop.latex.tools": [{"name": "xelatex","command": "xelatex","args": ["-synctex1","-interactionnonstopmode","-file-line-error","%DOCF…

日期类的实现,const成员

目录 一&#xff1a;日期类实现 二&#xff1a;const成员 三&#xff1a;取地址及const取地址操作符重载 一&#xff1a;日期类实现 //头文件#include <iostream> using namespace std;class Date {friend ostream& operator<<(ostream& out, const Dat…

mysql定时执行语句

一、前提 #确保事件调度为开放(ON) SHOW VARIABLES LIKE event_scheduler;二、场景 1、创建test01 表&#xff0c;表中存储1000条数据&#xff1b; 2、创建空表test02&#xff0c;表结构与 test01相同&#xff1b; 3、将test01中的数据以每分钟10条的形式转移到test02中去三、…

基于Spring Boot的校园博客系统设计与实现

基于Spring Boot的校园博客系统设计与实现 开发语言&#xff1a;Java框架&#xff1a;springbootJDK版本&#xff1a;JDK1.8数据库工具&#xff1a;Navicat11开发软件&#xff1a;eclipse/myeclipse/idea 系统部分展示 系统功能界面图&#xff0c;在系统首页可以查看首页、文…

Java面试八股之简述Java中assert的作用

简述Java中assert的作用 Java中的assert关键字用于在代码中插入断言&#xff08;Assertion&#xff09;&#xff0c;断言是一种在开发和测试阶段用于验证程序内部状态或假设的机制。其主要作用包括&#xff1a; 条件检查&#xff1a; assert语句用于在特定代码点上检查一个布…

Microsoft Universal Print 与 SAP 集成教程

引言 从 SAP 环境打印是许多客户的要求。例如数据列表打印、批量打印或标签打印。此类生产和批量打印方案通常使用专用硬件、驱动程序和打印解决方案来解决。 Microsoft Universal Print 是一种基于云的打印解决方案&#xff0c;它允许组织以集中化的方式管理打印机和打印机驱…

python u是什么意思

u&#xff1a;表示unicode字符串&#xff0c;默认模式&#xff0c;里边的特殊字符会被识别。 作用&#xff1a;后面字符串以unicode格式进行编码&#xff0c;一般用在中文字符串前面&#xff0c;防止因为源码储存格式问题&#xff0c;导致再次使用时出现乱码。 用法&#xff…

基于springboot实现迪迈手机商城设计系统项目【项目源码+论文说明】

基于springboot实现迪迈手机商城设计系统演示 研究背景 当前社会各行业领域竞争压力非常大&#xff0c;随着当前时代的信息化&#xff0c;科学化发展&#xff0c;让社会各行业领域都争相使用新的信息技术&#xff0c;对行业内的各种相关数据进行科学化&#xff0c;规范化管理。…

【RAG 博客】RAG-Fusion:引入 Multi-Query 来丰富用户查询的结果

Blog&#xff1a;Forget RAG, the Future is RAG-Fusion ⭐⭐⭐⭐ Code&#xff1a;github.com/Raudaschl/rag-fusion 文章目录 一、RAG-Fusion 的工作机制二、实现细节2.1 Multi-Query Generation2.2 Reciprocal Rank Fusion&#xff08;RRF&#xff09;2.3 Generative Output…