C++类和对象上篇

news2024/12/23 22:09:51

在这里插入图片描述

🐇

🔥博客主页: 云曦
📋系列专栏:[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指针呢,到类和对象中篇会给大家讲到。

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

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

相关文章

Java创建并遍历N叉树(前序遍历)

力扣 title589&#xff1a;N叉树的前序遍历 给定一个 n 叉树的根节点 root &#xff0c;返回 其节点值的 前序遍历 。 n 叉树 在输入中按层序遍历进行序列化表示&#xff0c;每组子节点由空值 null 分隔&#xff08;请参见示例&#xff09;。 思路&#xff1a; 1.初始化时…

C++_set和map的学习

1. 关联式容器 STL中的容器有序列式容器和关联式容器。 其中 vector 、 list 、 deque 、 forward_list(C11)就是序列式容器&#xff0c; 因为其底层为线性序列的数据结构&#xff0c;里面 存储的是元素本身 关联式容器 也是用来存储数据的&#xff0c;与序列式容器不同的是&am…

企业办公网络安全为何每个企业都要重视

随着互联网的持续发展&#xff0c;当前大量企业通过网络将集团总部与各分公司/厂区结合起来&#xff0c;便捷的沟通和共享方式大大提高了企业的生产力和工作效率&#xff0c;如何能够保障一个稳定、安全、便捷的整体网络成为企业IT建设的重要课题。对大量企业用户进行调研后发现…

万界星空科技商业开源MES+项目合作+商业开源低代码平台

今天我想和大家分享的是一套商业开源的 MES制造执行管理系统带源码。对于制造业而言&#xff0c;MES 是一个至关重要的系统&#xff0c;它可以帮助企业提高生产效率、优化资源利用、提高产品质量&#xff0c;从而增强市场竞争力。 什么是 MES&#xff1f; MES 是指通过计算机技…

llama-factory/peft微调千问1.5-7b-chat

目标 使用COIG-CQIA数据集和通用sft数据集对qwen1.5-7b-chat进行sft微调,使用公开dpo数据集进行dpo对齐。学习千问的长度外推方法。 一、训练配置 使用Lora方式, 将lora改为full即可使用全量微调。 具体的参数在 该框架将各个参数、训练配置都封装好了,直接使用脚本,将数…

unity项目《样板间展示》开发:菜单界面

unity项目《样板间展示》开发&#xff1a;菜单界面 前言UI菜单创建逻辑实现结语 前言 这是这个项目demo教程的最后一节&#xff0c;这节是菜单界面部分的创建 UI菜单创建 创建一个新的场景&#xff0c;在Scene文件中右键选择Create->Scene&#xff0c;创建新的场景 在场景…

【Linux】创建/扩容swap交换空间swap优化

一、当前交换空间大小 目前交换空间大小为2G 二、创建swap交换空间 #创建大小为2G的交换空间 [roothadoop01 data1]# dd if/dev/zero of/data1/swapfile bs1M count2048 #将文件设置为交换空间 [roothadoop01 data1]# mkswap /data1/swapfile #启用交换空间 [roothadoop01 da…

ElasticSearch教程入门到精通——第一部分(基于ELK技术栈elasticsearch 8.x新特性)

ElasticSearch教程入门到精通——第一部分&#xff08;基于ELK技术栈elasticsearch 8.x新特性&#xff09; 1. ElasticSearch安装&#xff08;略&#xff09;2. ElasticSearch基础功能2.1 索引操作2.1.1 创建索引2.1.2 Head 索引2.1.3 查询索引2.1.3.1 查询单独索引2.1.3.2 查询…

智能产品信息模型-控制信息模型

数字化的核心是数字化建模&#xff0c;为一个事物构建数字模型是一项十分复杂的工作。不同的应用场景&#xff0c;对事物的关注重点的不同的。例如&#xff0c;对于一个智能传感器而言&#xff0c;从商业的角度看&#xff0c;产品的信息模型中应该包括产品的类型&#xff0c;名…

Vue 组件的三大组成部分

Vue 组件通常由三大组成部分构成&#xff1a;模板&#xff08;Template&#xff09;、脚本&#xff08;Script&#xff09;、样式&#xff08;Style&#xff09; 模板部分是组件的 HTML 结构&#xff0c;它定义了组件的外观和布局。Vue 使用基于 HTML 的模板语法来声明组件的模…

如何维持CISSP证书:附免费获取CPE学分的16个官方渠道

CISSP 证书只有三年有效期&#xff08;如2023.11-2026.10&#xff09;&#xff0c;需要每年维护才能续证。持证者需要持续获取 CPE 学分来维持证书&#xff0c;否则证书到期后将失效。本文主要介绍维护CISSP证书的2个必备条件及16个CPE学分官方获取渠道。 1. 证书维持的2个必备…

AI大模型探索之路-训练篇10:大语言模型Transformer库-Tokenizer组件实践

系列篇章&#x1f4a5; AI大模型探索之路-训练篇1&#xff1a;大语言模型微调基础认知 AI大模型探索之路-训练篇2&#xff1a;大语言模型预训练基础认知 AI大模型探索之路-训练篇3&#xff1a;大语言模型全景解读 AI大模型探索之路-训练篇4&#xff1a;大语言模型训练数据集概…

springcloud微服务搭建多数据源(mysql,oracle,postgres,等等)管理模块,支持通过注解方式切换不同类型的数据库

1.背景 同一套微服务管理系统&#xff0c;业务完全一样&#xff0c;但不同的客户可能要求使用自己熟悉的数据库&#xff0c;比如&#xff0c;mysql&#xff0c;oracle&#xff0c;postgres&#xff0c;还有一些国产数据库。如果能够将数据库模块独立出来&#xff0c;兼容各家的…

Mybatis进阶(映射关系一对一 )

文章目录 1.基本介绍1.基本说明2.映射方式 2.配置xml方式&#xff08;多表联查&#xff09;1.数据库表设计2.新建子模块1.创建子模块2.创建基本结构 3.MyBatisUtils.java和jdbc.properties和mybatis-config.xml与原来的一致4.IdenCard.java5.Person.java6.IdenCardMapper.java7…

【漏洞复现】北京中科聚网一体化运营平台catchByUrl存在文件上传漏洞

漏洞描述 北京中科聚网一体化运营平台 catchByUrl存在文件上传漏洞,未经身份验证的攻击者可利用此漏洞上传后门文件,从而获取服务器权限。 免责声明 技术文章仅供参考,任何个人和组织使用网络应当遵守宪法法律,遵守公共秩序,尊重社会公德,不得利用网络从事危害国家安…

订票系统|基于Springboot+vue的火车票订票系统(源码+数据库+文档)

订票系统目录 基于Springbootvue的火车票订票系统 一、前言 二、系统设计 三、系统功能设计 1会员信息管理 2 车次信息管理 3订票订单管理 4留言板管理 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码获取&#xff1a; 博主介绍…

小区服务|基于SprinBoot+vue的小区服务管理系统(源码+数据库+文档)

目录 基于SprinBootvue的小区服务管理系统 一、前言 二、系统设计 三、系统功能设计 1管理员登录 2 客服聊天管理、反馈管理管理 3 公告信息管理 4公告类型管理 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码获取&#xff1a; 博…

cmake的使用方法: 生成库文件

一. 简介 前面文章学习了针对单个 .c文件&#xff0c;cmake 工具是如何编译的&#xff1f; 针对包含多个 .c文件&#xff0c;cmake工具又是如何编译的&#xff1f;文章如下&#xff1a; cmake的使用方法: 单个源文件的编译-CSDN博客 cmake的使用方法: 多个源文件的编译-CS…

css---浮动知识点精炼汇总

前言 欢迎来到我的博客 个人主页:北岭敲键盘的荒漠猫-CSDN博客 浮动简单理解与介绍 这是我们普通的页面标签效果。 每个标签从上到下依次排列。 浮动顾名思义就是让这个标签飞翔起来。 他飞起来后&#xff0c;后面的标签来到他的位置上。 而浮动的标签就会显示在标签的上面。…

【webrtc】MessageHandler 9: 基于线程的消息处理:执行Port销毁自己

Port::Port 构造的时候,就触发了一个异步操作,但是这个操作是要在 thread 里执行的,因此要通过post 消息 MSG_DESTROY_IF_DEAD 到thread跑:port的创建并米有要求在thread中 但是port的析构却在thread里 这是为啥呢?