【C++基础(五)】类和对象(上)

💓博主CSDN主页:杭电码农-NEO💓

⏩专栏分类:C++初阶之路⏪

🚚代码仓库:NEO的学习日记🚚

🌹关注我🫵带你学习C++
  🔝🔝


在这里插入图片描述

类和对象-上

  • 1. 前言
  • 2. 类的引入
  • 3. 类的定义
  • 4. 类的访问限定符
  • 5. 类的实例化
  • 6. 类对象模型
    • 6.1 类对象的存储模式
  • 7. this指针
    • 7.1 this指针的特性
    • 7.2 this指针的用处
  • 8. 总结以及拓展

1. 前言

C语言是面向过程的语言
关注的是过程
而C++是面向对象的语言
关注的是对象

而类和对象就是面向对象的基础!

在这里插入图片描述

C++为了兼容C语言
保留了原先的玩法,并且增加了新的玩法

本章重点:

本篇文章着重讲解类的概念,基本特性
成员函数的性质,和最重要的this指针


2. 类的引入

C语言的结构体功能单一
只能定义成员变量,不能定义函数
而C++中新增了一个玩法:
可以定义成员函数

比如:

struct NEO
{
	int a;
	char b[20];
	void test()//成员函数
	{
		cout<<"杭州电子科技大学"<< endl;
	}
	void push(char ch,int i)//成员函数
	{
		b[i] = ch;
	}
};

int main()
{
	NEO tmp;
	tmp.test();//会打印"杭州电子科技大学"
	tmp.push('a',1);//数组b下标为1的位置会被插入一个字符'a'
}

在C++中,C的结构体就是类
并且C++中更喜欢用class替代struct


3. 类的定义

class className
{
	// 类体:由成员函数和成员变量组成
};   一定要注意后面的分号

类的定义与结构体类似
只不过将struct换成了class

类成员函数的两种定义方式:

  1. 声明和定义都放在类中:
class people
{
	char* name;
	char* sex;
	int height;
	int age;
	void peoinfo()//打印此人的消息
	{
		cout<<name<<" "<<sex<<" "<<height<<" "<<age;
	}
};

这个类的成员函数的声明和定义都在类中
编译器就可能把此函数当作内联处理!
只要是在类中定义的函数都会被看作内联

当然这只是给编译器一建议
具体会不会内当作内联要看代码长度

  1. 类函数声明定义分开

一般说的声明和定义分开是指:
声明放在.h文件,定义放在.cpp文件

.h文件

class people
{
	char* name;
	char* sex;
	int height;
	int age;
	void peoinfo()//打印此人的消息
};

.cpp文件(错误实例)

void peoinfo()//打印此人的消息
	{
		cout<<name<<" "<<sex<<" "<<height<<" "<<age;
	}

注意:在另一个文件中,必须要加上类名::
否则系统不知道你是要新定义一个函数
还是要定义已经声明过的函数

正解:

void people::peoinfo()//打印此人的消息
	{
		cout<<name<<" "<<sex<<" "<<height<<" "<<age;
	}

4. 类的访问限定符

首先介绍三个访问限定符:

在这里插入图片描述

访问限定符说明:

  1. public修饰的成员在类外
    可以直接被访问

  2. protected和private修饰的成员
    在类外不能直接被访问

  3. 访问权限作用域:
    从该访问限定符出现的位置开始直到
    下一个访问限定符出现时为止

  4. 如果后面没有访问限定符了
    作用域就一直到类结束

  5. class的默认访问权限为private
    struct为public(因为要兼容C)

举例说明:

class NEO
{
public:
	void test1()
	{
		cout<<"haha";
	}

	void test2()
	{
		cout<<"hehe";
	}

private:
	int a;
	char b[20];
	double c;
}

int main()
{
	NEO tmp;
	tmp.test1();//正常运行
	tmp.a = 10;//运行报错
	tmp.c = 20;//运行报错
	return 0;
}

此类中,public和private
之间的成员是共有的,类外可以访问
private到类结束的成员是私有的
类外不能访问!

需要注意的点:

不管成员函数是共有还是私有
也不管成员变量是共有还是私有
成员函数都可以访问到成员变量!


5. 类的实例化

用类类型创建对象的过程,称为类的实例化

在实例化类对象之前,这个类并不占用内存

比如:

class Person
{
public:
	void printper()
	{
		cout<<name;
	}
private:
	char* name;
};

int main()
{
	Person.name = "NEO";//编译报错,还没有实例化对象
	Person p1;
	return 0;
}

若没有实例化对象p1
这个class类是不会开辟空间的!

class类就像一个设计图纸一样
在按照这个图纸建设房子前
这块区域是没有空间占用的
实例化对象就像按照图纸修房子一样
会占用空间

在这里插入图片描述


6. 类对象模型

怎么计算一个class类的大小?

例如:下面这两个类:

class A
{
	void PrintA()
	{
		cout << a << endl;
	}
	int a;
	char b;
};

class B
{
	int a;
	char b;
};

int main()
{
	printf("类A的大小: %d\n", sizeof(A));
	printf("类B的大小: %d\n", sizeof(B));
	return 0;
}

在这里插入图片描述

结论:

  1. 类中的成员函数不算在类的大小中
  2. 类的大小遵守结构体内存对齐规则
  3. 空类(没有成员变量)的大小是1字节

注:如果你不知道结构体内存对齐规则
请点击:结构体内存对齐规则


6.1 类对象的存储模式

为啥类中的成员函数不占空间?
那函数存储在什么位置?

带着这样的疑惑来看看类的存储模式:

  • 类成员变量存储在实例化对象中
  • 类成员函数存储在公共的代码段

可以用下面这张图来理解:

在这里插入图片描述

对类成员变量的解释:

由于每一个对象中的变量的值可能不同
所以成员变量存储在不同的对象中

对类成员函数的解释:

但是每个对象调用的函数是相同的
为了节省空间,将成员函数从对象中剥离
到公共代码段,不管实例化多少个对象
只要调用成员函数就会去代码段找!


7. this指针

先看以下的日期类:

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,7,22);//初始化对象
	return 0;
}

看似Init只有三个参数
看似调用Init时只传了三个参数

但其实还有一个隐藏的指针this!

可以用下图理解this的位置:

在这里插入图片描述

并且在每一个成员变量之前
都有this指针解引用访问它:

在这里插入图片描述


7.1 this指针的特性

基本特性:

  1. this指针的类型:const 类类型 *
    即成员函数中,不能给this指针赋值

  2. 只能在“成员函数”的内部使用

  3. this指针不能我们显示去写
    也不能我们显示去传对象地址

  4. this指针存储在栈区,不存储在对象中

对特性的理解:

不能这样写代码:

class A
{ 
void Init(A* this,int a)
{
	_a=a;
}
 int _a;
};

int main()
{
	A a1;
	a1(&a,10);
}

假如这样写代码,那么函数参数就有三个
系统还是会自动传this指针,会报错


7.2 this指针的用处

假设我们实例化了两个对象
分别是d1和d2

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;
	d1.Init(2023,7,22);//初始化对象
	d2.Init(2023,7,23);
	return 0;
}

已知成员函数是放在公共代码段的
假如没有this指针存在
函数体又没有区别不同对象的手段

那么就会出现一个问题:
对象d1调用函数Init时,函数不知道是
哪一个对象调用了它,就无法区分对象

使用this指针将对象的地址传入函数中
函数体就可以区分不同对象了!


8. 总结以及拓展

本章是类和对象的入门篇
只介绍了类的解基本概念和特性
其中比较重要的是this指针
它还会陪伴我们很久!

基础不牢,地动山摇
类学不会,学C++就受罪

在这里插入图片描述

拓展: C++命名方式

C++又很多习惯的命名方式
这里介绍一个:驼峰法命名

  • 单词和单纯之间首字母大写
  • 函数名,类名首字母大写
  • 变量首字母小写,后面单词首字母大写
  • 成员变量的首字母前加下划线_

举例说明:

class Date
{ 
public:
  void InitDate(int year, int month, int day)//initialize date
  {                                          //初始化日期,简写后,I和D要大写
    _year = year;
    _month = month;
    _day = day;
  }
  void PrintInfo()//printf information,简写后P和I要大写
  {
    cout <<_year<< "-" <<_month << "-"<< _day <<endl;
  }
private:
  int _year; //成员变量前面加_
  int _month;
  int _day;     
};

🔎 下期预告:类和对象(中) 🔍

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

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

相关文章

Obsidian同步到Notion

插件介绍 将Obsidian的内容同步到Notion需要使用一个第三方插件"Obsidian shared to Notion"EasyChris/obsidian-to-notion: Share obsidian markdown file to notion and generate notion share link 同步obsdian文件到notion&#xff0c;并生成notion分享链接&am…

[SSM]手写Spring框架

目录 十一、手写Spring框架 第一步&#xff1a;创建模块myspring 第二步&#xff1a;准备好要管理的Bean 第三步&#xff1a;准备myspring.xml配置文件 第四步&#xff1a;核心接口实现 第五步&#xff1a;实例化Bean 第六步&#xff1a;给Bean属性赋值 第七步&#xff…

JVM运行时数据区——方法区、堆、栈的关系

方法区存储加载的字节码文件内的相关信息和运行时常量池&#xff0c;方法区可以看作是独立于Java堆的内存空间&#xff0c;方法区是在JVM启动时创建的&#xff0c;其内存的大小可以调整&#xff0c;是线程共享的&#xff0c;并且也会出现内存溢出的情况&#xff0c;也可存在垃圾…

Android - 集成三方模组原厂WiFi Hal库问题

Android - 集成三方模组原厂WiFi Hal库问题 最近Android 11产品平台上需要集成三方WiFi/AP模组厂商提供的hal静态库时遇到一个问题&#xff1a;将三方的库代码集成进系统&#xff0c;并正确配置、编译出lib_driver_cmd_xxx.a(xxx一般是厂商的名字缩写&#xff0c;仅仅是个后缀用…

在英特尔 CPU 上微调 Stable Diffusion 模型

扩散模型能够根据文本提示生成逼真的图像&#xff0c;这种能力促进了生成式人工智能的普及。人们已经开始把这些模型用在包括数据合成及内容创建在内的多个应用领域。Hugging Face Hub 包含超过 5 千个预训练的文生图 模型。这些模型与 Diffusers 库 结合使用&#xff0c;使得构…

【算法基础:搜索与图论】3.4 求最短路算法(Dijkstrabellman-fordspfaFloyd)

文章目录 求最短路算法总览Dijkstra朴素 Dijkstra 算法&#xff08;⭐原理讲解&#xff01;⭐重要&#xff01;&#xff09;&#xff08;用于稠密图&#xff09;例题&#xff1a;849. Dijkstra求最短路 I代码1——使用邻接表代码2——使用邻接矩阵 补充&#xff1a;稠密图和稀疏…

WPF实战项目十(API篇):引入工作单元UnitOfWork

1、通过github地址&#xff1a;https://github.com/arch/UnitOfWork&#xff0c;下载UnitOfWork的代码&#xff0c;将工作单元部分的代码引用到自己的项目&#xff0c;新增UnitOfWork文件夹。 2、在UnitOfWork文件夹下引用UnitOfWork下的IPagedList.cs、PagedList.cs类&#xf…

iOS--编译连接的过程_2

文章目录 iOS编译&#xff08;一&#xff09;编译器前端 编译器后端执行一次XCode build的流程 IPA包的内容二进制文件的内容iOS Link Map File文件说明1. Link Map File 是什么2. Link Map File 有什么用3. 生成 Link Map File查看Link Map File1&#xff09;路径部分计算机系…

Docker 核心概念深度解析:探索容器、镜像和仓库在Docker生态系统中的重要作用和 应用

&#x1f337;&#x1f341; 博主 libin9iOak带您 Go to New World.✨&#x1f341; &#x1f984; 个人主页——libin9iOak的博客&#x1f390; &#x1f433; 《面试题大全》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33…

机器学习算法基础-覃秉丰 笔记版

文章目录 笔记回归sklearn-LASSOsklearn-一元线性回归sklearn-多元线性回归sklearn-岭回归sklearn-弹性网ElasticNetsklearn-逻辑回归sklearn-非线性逻辑回归标准方程法-岭回归梯度下降法-一元线性回归梯度下降法-多元线性回归梯度下降法-逻辑回归梯度下降法-非线性逻辑回归线性…

【Java基础教程】(四十三)多线程篇 · 下:深入剖析Java多线程编程:同步、死锁及经典案例——生产者与消费者,探究sleep()与wait()的差异

Java基础教程之多线程 下 &#x1f539;本节学习目标1️⃣ 线程的同步与死锁1.1 同步问题的引出2.2 synchronized 同步操作2.3 死锁 2️⃣ 多线程经典案例——生产者与消费者&#x1f50d;分析sleep()和wait()的区别&#xff1f; &#x1f33e; 总结 &#x1f539;本节学习目标…

ARM练习

通过汇编语言完成LED1-3循环点亮练习 .text .global _start _start: /**********LED1点灯**************/ /*初始化RCC*/ RCC_INIT:LDR R0,0X50000A28LDR R1,[R0]ORR R1,R1,#(0X1<<4)ORR R2,R1,#(0x1<<5)STR R1,[R0]STR R2,[R0]LED1_INIT:设置输出模式LDR R0,0X5…

企业网络安全合规框架体系

云安全联盟大中华区发布报告《企业网络安全合规框架体系》&#xff08;以下简称报告&#xff09;&#xff0c;该报告对典型业务场景给出了参考实例&#xff0c;供广大甲方单位、集成商、咨询机构参考。 近些年&#xff0c;随着国内网络安全领域相关法律、法规、政策文件、标准规…

数据结构--图的遍历 BFS

数据结构–图的遍历 BFS 树的广度优先遍历 从 1 结点进行 b f s bfs bfs的顺序&#xff1a; 【1】 【2】【3】【4】 【4】【6】【7】【8】 图的广度优先遍历 从 2 号点开始 b f s bfs bfs的顺序&#xff1a; 【2】 【1】【6】 【5】【3】【7】 【4】【8】 树 vs 图 不存在“回…

ChatGPT:人工智能语言模型的革命性进步

&#x1f337;&#x1f341; 博主 libin9iOak带您 Go to New World.✨&#x1f341; &#x1f984; 个人主页——libin9iOak的博客&#x1f390; &#x1f433; 《面试题大全》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33…

PHP后台登录功能单账号登录限制

PHP后台登录功能单账号登录限制 单账号登陆是什么第一步创建数据表第二步创建登录页面test2.html第三步创建登录提交test2.php第四步访问后台首页第五步演示 单账号登陆是什么 一个用户只能登录一个账号通常被称为单账号登录限制或单用户单账号限制。这意味着每个用户只能使用…

微服务一 实用篇 - 5.分布式搜索引擎(ElasticSearch基础)

《微服务一 实用篇 - 5.分布式搜索引擎&#xff08;ElasticSearch基础&#xff09;》 提示: 本材料只做个人学习参考,不作为系统的学习流程,请注意识别!!! 《微服务一 实用篇 - 5.分布式搜索引擎&#xff08;ElasticSearch基础&#xff09;》 《微服务一 实用篇 - 5.分布式搜索…

vue实现excel数据下载,后端提供的list由前端转excel并下载

前言,因为项目需求需要,我们需要把后端传来的list转成excel模板,并且下载下来) 之前有用的插件,但是会有少0的情况,如下 所以采用另一个项目用过的方法,最终完美实现效果,如下: 1,首先我们来看下后端提供的数据结构 2,具体前端代码如下 封装的组件,需要的同学直接copy就行(这…

ORACLE实时SQL监控视图

引言 实时的SQL监控&#xff08;Real Time SQL Monitoring&#xff09;是Oracle 11g的一个新特性&#xff0c;它是一项强大的工具&#xff0c;用于监视和分析正在执行的SQL语句的性能和执行计划。该功能允许我们实时地跟踪SQL查询的执行过程&#xff0c;以及了解其资源消耗、等…

PHP登陆/php登录--【强撸项目】

强撸项目系列总目录在000集 PHP要怎么学–【思维导图知识范围】 文章目录 本系列校训本项目使用技术 上效果图phpStudy 设置导数据库 项目目录如图&#xff1a;页面代码后台代码 这么丑的界面能忍&#xff1f;配套资源作业&#xff1a; 本系列校训 用免费公开视频&#xff0…