类和对象【上】【C++】

P. S.:以下代码均在VS2019环境下测试,不代表所有编译器均可通过。
P. S.:测试代码均未展示头文件stdio.h的声明,使用时请自行添加。

  

在这里插入图片描述

                                           博主主页:LiUEEEEE
                                                C++专栏
                                              C语言专栏
                                            数据结构专栏
                                            排序算法专栏
                                         力扣牛客经典题目专栏

目录

  • 1、类的定义
  • 2、类的引入
  • 3、类的作用域
  • 4、类的实例化
  • 5、类对象的大小和类对象的存储方式
    • 5.1 类对象的大小
    • 5.2 类对象的存储方式
  • 6、类的 this 指针
    • 6.1 this 指针介绍
    • 6.2 this 指针特性
  • 7、结语

1、类的定义


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

  class为定义类的关键字,ClassName为类的名字,{}中为类的主体,注意类定义结束时后面分号不能省略。
  类体中内容称为类的成员:类中的变量称为类的属性或成员变量; 类中的函数称为类的方法或者成员函数

  类的两种定义方式:

  1. 声明和定义全部放在类体中,需注意:成员函数如果在类中定义,编译器可能会将其当成内
    联函数处理。
class Eg1
{
public:
	void ShowInfo()
	{
		cout << "name : " << name << endl;
		cout << "sex : " << sex << endl;
		cout << "age : " << age << endl;
	}
private:
	char* name;
	char* sex;
	int age;
};
  1. 类声明放在.h文件中,成员函数定义放在.cpp文件中,注意:成员函数名前需要加类名" :: "
< test.h >
class Eg2
{
public:
	void ShowInfo();
private:
	char* name;
	char* sex;
	int age;
};
< test.cpp >
void Eg2::ShowInfo()
{
	cout << "name" << endl;
	cout << "sex" << endl;
	cout << "age" << endl;
}




2、类的引入


  C语言结构体中只能定义变量,在C++中,结构体内不仅可以定义变量,也可以定义函数。比如:之前在数据结构初阶中,用C语言方式实现的栈,结构体中只能定义变量;现在以C++方式实现,会发现struct中也可以定义函数,例如:
struct No1
{
	int Add(int x, int y)
	{
		int z = x + y;
		return z;
	}
	int _a;
	int _b;
};

int main()
{
	No1 test1;
	int out = test1.Add(100, 200);
	cout << out << endl;

	return 0;
}

在这里插入图片描述
  事实上,在C++编译器中,struct 和 class 都会被识别为类,但它们之间却又细微差别,在 class 中,类成员默认为保护状态(即私有状态),外界在使用时不可以直接对其内容进行访问,而 struct中,类成员默认为公有状态,使用时可以直接对其成员进行访问。

  而操控这一切的就是C++中的访问限定符:

  • public(公有)
  • protected(保护)
  • private(私有)

  其中 protected 和 private 均是私有状态,可以认定为无法被使用者直接访问。
  一般情况下,在书写类 class 时会写成下列格式:

class Eg1
{
public:
	//类成员...
	//类函数...
private:
	//类成员...
};

  C++中访问限定符的作用范围时访问限定符起始位置到下一个访问限定符出现位置或类结束为止(class 中 {} 结束位置)。

  通常情况下,代码书写者会将类成员变量存放位私有状态,让类成员操作函数存放为公有状态,这样情形可以方便使用者拥有一个接口来对类进行操作,但不会因为错误操作类成员变量而出现 bug 。



3、类的作用域


  在上述演示过程中可以发现类也是通过 " { } " 括起来的,这就说明了类也是一个作用域,故在类体外定义成员时,需要使用 " :: " 来指明成员属于哪一个类域,例如:
class Eg3
{
public:
	void Show();
private:	
	int a;
};
void Eg3::Show()
{
	cout << " a " << endl;
}




4、类的实例化


  用类类型创建对象的过程,称为类的实例化
  1. 类是对对象进行描述的,是一个模型一样的东西,限定了类有哪些成员,定义出一个类并没有分配实际的内存空间来存储它;比如:入学时填写的学生信息表,表格就可以看成是一个类,来描述具体学生信息。
  2. 一个类可以实例化出多个对象,实例化出的对象 占用实际的物理空间,存储类成员变量。
  3. 做个比方。类实例化出对象就像现实中使用建筑设计图建造出房子,类就像是设计图,只设计出需要什么东西,但是并没有实体的建筑存在,同样类也只是一个设计,实例化出的对象才能实际存储数据,占用物理空间。
    在这里插入图片描述




5、类对象的大小和类对象的存储方式

5.1 类对象的大小


  类的大小计算可以类比C语言中的结构体计算方式:忘记可以回看

                       C语言结结结结结构体!
   那如果类中没有任何成员,类的大小又是多少呢?

class EG
{};

int main()
{
	cout << sizeof(EG) << endl;
	return 0;
}

在这里插入图片描述  通过VS执行结果可以看出,当类中无成员时,其所对应的大小为1,究其根本是因为类只是一个类型,相当于一个模板,当使用者使用类来创建对象时,即使类中没有结构体成员,但所创建的对象在内存中需要占据空间,而如果此类的大小为0,就会出现冲突,即使创建了类对象,在内存中也找不到,所以C++为了让类的实例化更加有效且不出现bug,令类在没有成员时的大小为1(单位:字节)。

5.2 类对象的存储方式


  来看一段代码:
class EG
{
public:
	void Show()
	{
		cout << "C++" << endl;
	}
private:
	int a;
	int b;
};

int main()
{
	cout << sizeof(EG) << endl;

	return 0;
}

在这里插入图片描述
  通过VS运行结果我们可以看出,当类中拥有两个整型成员变量和一个成员函数时,其大小为8个字节,但通过C语言中结构体的对齐规则我们可以知道,这个类模型中的两个成员变量就占据了8个空间,那其中的成员函数难道就不占据空间吗?

  回想上文中提到,类是一个模型,其对应着很多个类对象,即一对多的关系,而C++是一个极度追求效率的语言,如果编译器将成员函数放在类中占据空间,那么使用者在使用时每开辟一个新的对象,都会附带着成员函数所占据的空间大小的累赘,数量少则无大碍,如果在一个庞大的工程中呢?那效率的影响将会是巨大的,故C++将类的成员函数放在了一片公共区域中,当使用者需要使用时,可直接从公共区域Call这个函数即可。




6、类的 this 指针

6.1 this 指针介绍


  在C++中存在着一个隐含的指针—— this 指针,在使用过程中我们通常不会书写他,但在编译的过程中,编译器会自动地添加其进入函数等使用的地方,例如:
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, d2;
	d1.Init(2022, 1, 11);
	d2.Init(2022, 1, 12);
	d1.Print();
	d2.Print();
	return 0;
}

  例如上述代码中,主函数调用 Init 函数时,没有传入类对象 d1 和 d2 的地址,那编译器是如何知道要设置的对象是哪一个呢?

  对于上述类,有这样的一个问题:
  C++中通过引入this指针解决该问题,即:C++编译器给每个“非静态的成员函数“增加了一个隐藏的指针参数,让该指针指向当前对象(函数运行时调用该函数的对象),在函数体中所有“成员变量”的操作,都是通过该指针去访问。只不过所有的操作对用户是透明的,即用户不需要来传递,编译器自动完成,相当于下面代码所示:

	d1.Init(&d1, 2022, 1, 11);
	
	void Init(Data* this, int year, int month, int day)
	{
		this->_year = year;
		this->_month = month;
		this->_day = day;
	}

6.2 this 指针特性

  1. this指针的类型:类类型* const,即成员函数中,不能给this指针赋值。
  2. 只能在“成员函数”的内部使用。
  3. this指针本质上是“成员函数”的形参,当对象调用成员函数时,将对象地址作为实参传递给
    this形参。所以对象中不存储this指针。
  4. this指针是“成员函数”第一个隐含的指针形参,一般情况由编译器通过ecx寄存器自动传
    递,不需要用户传递。




7、结语


在这里插入图片描述

  十分感谢您观看我的原创文章。
  本文主要用于个人学习和知识分享,学习路漫漫,如有错误,感谢指正。
  如需引用,注明地址。

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

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

相关文章

泰勒展开式在Android系统或应用程序中的应用

泰勒展开式在Android系统或应用程序中的应用 引言 泰勒展开式(Taylor Series)是高等数学中的一个重要工具,它允许我们将一个复杂函数表示为一个无穷多项式的和,从而近似计算函数值。在Android开发中,理解和应用泰勒展开式有助于优化涉及复杂数值计算的算法,提高应用程序…

感动的短视频:成都柏煜文化传媒有限公司

感动的短视频&#xff1a;瞬间触动心灵的温暖力量 在这个快节奏、高压力的时代&#xff0c;我们常常在忙碌与喧嚣中穿梭&#xff0c;心灵深处那份最纯粹的感动似乎变得愈发珍贵而难得。然而&#xff0c;就在这样一个数字化盛行的今天&#xff0c;短视频以其独特的魅力&#xf…

OpenSearch的演进与语义检索技术革新

周末听了一场关于Open Search的技术分析&#xff0c;整理如下&#xff0c;供大家参考。OpenSearch&#xff0c;作为ElasticSearch的一个分支&#xff0c;不仅继承了其强大的搜索和分析能力&#xff0c;更在开源社区的驱动下&#xff0c;不断演进和创新。本文将介绍OpenSearch的…

leetcode-21-回溯-全排列及其去重

一、[46]全排列 给定一个 没有重复 数字的序列&#xff0c;返回其所有可能的全排列。 示例: 输入: [1,2,3]输出: [ [1,2,3], [1,3,2], [2,1,3], [2,3,1], [3,1,2], [3,2,1] ] 其中&#xff0c;不需要使用startIndex used数组&#xff0c;其实就是记录此时path里都有哪些元素…

第十一章 Nest 创建动态模块

在 NestJS 中&#xff0c;动态模块允许在运行时动态添加和删除模块。这对于创建可扩展的和灵活的应用程序非常有用。 新建一个项目&#xff1a; nest new dynamic-module -p npm创建一个crud的模块&#xff1a; nest g resource test启动项目 浏览器访问 可以发现模块生效了 …

Python酷库之旅-第三方库openpyxl(20)

目录 一、 openpyxl库的由来 1、背景 2、起源 3、发展 4、特点 4-1、支持.xlsx格式 4-2、读写Excel文件 4-3、操作单元格 4-4、创建和修改工作表 4-5、样式设置 4-6、图表和公式 4-7、支持数字和日期格式 二、openpyxl库的优缺点 1、优点 1-1、支持现代Excel格式…

【技术杂谈】如何访问Github | 解决无法连接Github的问题

访问网页的过程 什么是域名&#xff1f;什么是IP地址&#xff1f;- 域名是网站的名称。 - IP地址是服务器在互联网上的逻辑地址。域名往往是固定的&#xff0c;但是IP地址很有可能是会改变的。计算机通过Host文件检查本地缓存是否有域名对应IP地址 Host文件路径 C:\Windows\Sy…

6.The hardest part about learing hard things(学一件难的事,难在哪里)

I’ve been recording a lot of podcast interviews for my upcoming book, Ultralearning.One of the reurring themes I’ve noticed in our conversations is that how people feel about learning is the overwhelming cause of the results they experience. 我为我的新书…

解决VSCode无法用ssh连接远程服务器的问题

原因&#xff1a; 因为windows自带的ssh无法连接远程服务器&#xff0c;需要用git底下的ssh.exe。 搜了很久&#xff0c;试过很多方法&#xff0c;包括替换掉环境变量中的ssh&#xff0c;但是都无效&#xff0c;最后发现是要在VSCode中配置需要使用哪个ssh.exe。 步骤&#…

11.优化算法之栈

1.删除字符串中的所有相邻重复项 可以用数组模拟栈结构 class Solution {public String removeDuplicates(String s) {if(s.length()<1){return s;}StringBuffer retnew StringBuffer();for(int i0;i<s.length();i){if(ret.length()<1){ret.append(s.charAt(i));}els…

字符编码-unicode码表

unicode在线码表&#xff1a;https://www.tamasoft.co.jp/en/general-info/unicode.html Unicode Table

Stable Diffusion中放大图像的3种方法

前言 要执行 ControlNet tile upscale&#xff1a; 您想使用 Stable Diffusion 创建包含大量细节的大型图像吗&#xff1f;您将需要使用升频器。在本文中&#xff0c;您将学习 3 种放大图像的方法。 人工智能升级器标清高档ControlNet瓷砖高档 您将看到比较并了解这些方法的优…

【Arduino】小飞鱼通达二开实验ESP32使用红外寻迹传感器 (图文)

在智能小车项目中都会有一个功能就是自动巡线&#xff0c;今天小飞鱼通达来实验的就是这个红外寻迹传感器。 红外寻迹传感器的原理就是有一个小灯发出红外光&#xff0c;光线照到物体后进行反射&#xff0c;有一个接收器进行接收&#xff0c;当在一定距离内会导通电路&#xf…

【AI绘画Stable Diffusion】教你制作 SD 光影文字,保姆级教程建议收藏!(附模型下载)

大家好&#xff0c;我是设计师阿威 最近光影文字又开始火起来了。今天讲讲怎么利用 Stable Diffusion 的 ControlNet 插件来制作光影图片。 1.下载光影模型组件 1.SD主模型&#xff1a;majicMIX realistic V6、xxmix9realistic_v26 2. ControlNet 的模型&#xff1a;Bright…

3、加密算法-AES和RSA

前两节博客主要是针对MD5和哈希算法&#xff0c;数字签名算法做了阐述和总结&#xff1b; 这篇文章主要是针对AES和RSA做一个概况和比较&#xff0c;以及相关的一些概念&#xff1b; 一、对称加密算法 对称加密算法是指加密和解密采用相同的密钥口&#xff0c;是可逆的(即可解…

高等数学在Android开发中的应用:函数极限与算法优化

高等数学在Android开发中的应用:函数极限与算法优化 在Android开发中,高等数学中的许多概念和技术都能够显著提高应用程序的性能和功能。这篇博客将探讨一些具体的数学原理,特别是函数极限在Android中的实际应用。 函数极限的基本概念 函数极限是微积分的基础,广泛应用于…

R可视化:好看的气泡图

加载R包 library(tidyverse) library(camcorder)gg_record(dir "tidytuesday-temp", device "png", width 8, height 8, units "in", dpi 320)导入数据 team_results <- readr::read_csv(https://raw.githubusercontent.com/rfordata…

有手就行,轻松本地部署 Llama、Qwen 大模型,无需 GPU

用 CPU 也能部署私有化大模型&#xff1f; 对&#xff0c;没错&#xff0c;只要你的电脑有个 8G 内存&#xff0c;你就可以轻松部署 Llama、Gemma、Qwen 等多种开源大模型。 非技术人员&#xff0c;安装 Docker、Docker-compose 很费劲&#xff1f; 不用&#xff0c;这些都不…

vue中路由来回切换页面直接卡死

今天发现一个很严重的问题&#xff0c;项目好不容易做好了&#xff0c;结果页面多了&#xff0c;切换之后卡死。页面所有的交互效果都失效了。 排查了许久的错误原因最后发现原来是路由名称重复了。 如上图当页面跳转到riskdetails详细页面之后&#xff0c;框架则被这个详情页…

SSE代替轮询?

什么是 SSE SSE&#xff08;Server-Sent Events&#xff0c;服务器发送事件&#xff09;&#xff0c;为特定目的而扩展的 HTTP 协议&#xff0c;用于实现服务器向客户端推送实时数据的单向通信。如果连接断开&#xff0c;浏览器会自动重连&#xff0c;传输的数据基于文本格式。…