【C++】——类和对象(上)

文章目录

  • 什么是类和对象
  • 类的定义
  • 类的访问限定符及其封装
  • 类的作用域
  • 类的实例化
  • 类的对象的大小计算
  • this指针

什么是类和对象

类是一个用户定义的类型,它封装了数据(称为属性或成员变量)和操作这些数据的方法(称为成员函数或方法)。类可以看作是创建对象的蓝图或模板,它定义了对象的行为(能做什么)和状态(有什么)。

类的定义

C++中的类和C语言中的结构体struct是非常相似的,C语言结构体中只能定义变量,在C++中,结构体内不仅可以定义变量,也可以定义函数。
比方说我创建栈(stack)和队列(list),在c语言中,他们的定义必须分开,否则编译器就无法判断他们同一功能的同名函数到底谁是谁的push,谁的top等等…
但是C++通过创建类,就可以很好的区分。

#include <iostream>
using namespace std;
class Stack
{
	void Push(int x)
	{
		//此处省略定义...
	}
	void Pop()
	{
		//此处省略定义...
	}
	int Top()
	{
		//此处省略定义...
	}

	int* a;
	int top;
	int capacity;
};//分号不能省略!

class和struct为定义类的关键字,ClassName为类的名字,{}中为类的主体,注意类定义结束时后面分
号不能省略。

类的访问限定符及其封装

访问限定符有三个:
public(公有)
private(私有)
protected(保护)

  1. public修饰的成员在类外可以直接访问,protected和private修饰的成员不能在类外直接访问。
  2. 访问权限作用域从该访问限定符出现的位置开始直到下一个访问限定符出现时为止。
class Stack
{
public://从这一行开始
	void Push(int x)
	{
		//此处省略定义...
	}
	void Pop()
	{
		//此处省略定义...
	}
	int Top()
	{
		//此处省略定义...
	}
	//在下一个访问限定符之前结束
private:
	int* a;
	int top;
	int capacity;
};
  1. 如果后面没有访问限定符,作用域就到 } 即类结束。
  2. class的默认访问权限为private,struct为public(因为struct要兼容C)。

类的作用域

类定义了一个新的作用域,类的所有成员都在类的作用域中。在类体外定义成员时,需要使用 :: 作用域操作符指明成员属于哪个类域。

类的实例化

类和对象的关系是一对多的关系
在这里插入图片描述

#include <iostream>
using namespace std;
class Stack
{
public:
	void Push(int x)
	{
		//此处省略定义...
	}
	void Pop()
	{
		//此处省略定义...
	}
	int Top()
	{
		//此处省略定义...
	}
private:
	int* a;
	int top;
	int capacity;
};
int main()
{
	//分成多个对象
	Stack st1;
	Stack st2;
	st1.Push(1);
	st2.Push(2);
	return 0;
}

类的对象的大小计算

类和结构体的大小计算方式是一模一样的。

  1. 第一个成员在与结构体偏移量为0的地址处。
  2. 其他成员变量要对齐到某个数字(对齐数)的整数倍的地址处。
    注意:对齐数 = 编译器默认的一个对齐数 与 该成员大小的较小值。VS中默认的对齐数为8
  3. 结构体总大小为:最大对齐数(所有变量类型最大者与默认对齐参数取最小)的整数倍。
  4. 如果嵌套了结构体的情况,嵌套的结构体对齐到自己的最大对齐数的整数倍处,结构体的整体大小就是所有最大对齐数(含嵌套结构体的对齐数)的整数倍

当我们讨论类实例的“大小”时,我们通常是在谈论该实例所有属性占用的内存空间,而不包括方法(函数)的大小。因为方法是与类相关联的,而不是与类的每个实例单独存储的。

class A//大小为8个字节
{
public:
	void Init()
	{
		a = 0;
		size = 0;
	}
	void Add()
	{

	}
private:
	int a;
	int size;
};
class B//大小为一个字节,如果为0个字节,那我就无法在main里定义,定义必须开空间。(表示对象存在)
{
public:
	void Print()
	{
		//...
	}
};
int main()
{
	A a;
	B b;
	return 0;
}

this指针

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

this指针的特性:

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

在这里插入图片描述
希望这篇博客对你有所帮助!!!

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

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

相关文章

23种设计模式之责任链模式

责任链模式 1、定义 避免将一个请求的发送者与接受者耦合在一起&#xff0c;让多个对象都有机会处理请求。将接受请求的对象连接成一条链&#xff0c;并且沿着这条链传递请求&#xff0c;直到有一个对象能够处理它为止 2、责任链模式结构 Handler(抽象处理者)&#xff1a;定…

事务ACID四大特性(图文详解~)

ACID ACID 是数据库管理系统中保证事务正确执行的四大特性的缩写。 1. Atomicity&#xff08;原子性&#xff09;&#xff1a; 原子性指事务是不可分割的单位&#xff0c;要么全部执行成功&#xff0c;要么全部失败回滚。—All or nothing. 通常使用日志记录机制来启动回滚功…

Linux 磁盘扩容

centos7 磁盘扩容 yum install -y cloud-utils-growpart 1.扩容vda 1 growpart /dev/vda 1 2.以 resize2fs 格式 resize2fs /dev/vda1 df -TH

机器学习开源分子生成系列(2)-基于三维形状和静电相似性的DeepFMPO v3D安装及使用

前言 本文是基于 3D 的分子生成方法DeepFMPO v3D的介绍及安装使用。 一、DeepFMPO v3D是什么&#xff1f; github代码介绍文章 在药物发现中&#xff0c;如何寻找具新颖性和结构多样性的候选分子是颇受药物设计科学家关注的问题。通过虚拟筛选的化学空间搜索往往会受限于筛选…

软件设计师(中级)备考视频教程

一、视频介绍 本视频主要包括软件设计师系统学习教程&#xff0c;通过学习本视频&#xff0c;可以帮助考生高效且深入地掌握软件设计师资格考试核心知识&#xff0c;全方位覆盖考试要点&#xff0c;从而轻松备战考试。视频不仅涵盖了考试所需的全面知识体系&#xff0c;还通过直…

鸿蒙实训笔记

第一天 #初始化一个新的NPM项目(根据提示操作) npm init #安装TSC、TSLint和NodeJS的类型声明 npm install -s typescript tslint types/node 在根目录中新建一个名为tsconfig.json的文件&#xff0c;然后在代码编辑器中打开&#xff0c;写入下述内容&#xff1a; {"co…

C# Winform的三态CheckBox,以及批量修改Panel中的控件

在C# WinForms中&#xff0c;如果你想批量修改一个Panel容器内的所有CheckBox控件的状态&#xff0c;你可以使用foreach循环来遍历Panel的Controls集合。下面是一个示例&#xff0c;展示了如何将一个Panel内所有的CheckBox控件设为选中状态&#xff08;Checked true&#xff0…

法制史学习笔记(个人向) Part.4

法制史学习笔记(个人向)_Part.4 6. 唐朝法律制度 6.1 立法概况 立法指导思想&#xff1a;德礼为政教之本&#xff0c;刑罚为政教之用&#xff08;德主刑辅 → \rightarrow →德本刑用&#xff09;&#xff0c;抬高了刑罚在法律体系中的作用&#xff0c;强调两者兼有&#xff0…

Isaac Lab(isaac sim)中使用python ros

ROS&#xff08;Robot Operating System&#xff09;为机器人技术提供了标准化的开发框架和中间件&#xff0c;通过定义接口和约定&#xff0c;简化了硬件与软件的集成&#xff0c;提高了开发效率。它拥有强大的工具集和生态系统&#xff0c;支持从算法开发到系统集成的全过程&…

Django任务管理

1、用django-admin命令创建一个Django项目 django-admin startproject task_manager 2、进入到项目下用命令创建一个应用 cd task_manager python manage.py startapp tasks 3、进入models.py定义数学模型 第2步得到的只是应用的必要空文件&#xff0c;要开始增加各文件实际…

skywalking-2-客户端-php的安装与使用

skywalking的客户端支持php&#xff0c;真的很棒。 官方安装文档&#xff1a;https://skywalking.apache.org/docs/skywalking-php/next/en/setup/service-agent/php-agent/readme/ 前置准备 本次使用的php版本是8.2.13: php -v PHP 8.2.13 (cli) (built: Nov 21 2023 09:5…

近期几首小诗汇总-生活~卷

生活 为生活飘零&#xff0c;风雨都不阻 路见盲人艰&#xff0c;为她心点灯 贺中科大家长论坛成立十五周年 科学家园有喜贺 园外丑汉翘望中 曾一学子入我科 正育科二盼长大 憧憬也能入此家 与科学家论短长 园外翘首听高论 发现有隙入此坛 竟然也能注册成 入园浏览惶然立 此贴…

PostgreSQL17索引优化之支持并行创建BRIN索引

PostgreSQL17索引优化之支持并行创建BRIN索引 最近连续写了几篇关于PostgreSQL17优化器改进的文章&#xff0c;其实感觉还是挺有压力的。对于原理性的知识点&#xff0c;一方面是对这些新功能也不熟悉&#xff0c;为了尽可能对于知识点表述或总结做到准确&#xff0c;因此需要…

springboot websocket 知识点汇总

以下是一个详细全面的 Spring Boot 使用 WebSocket 的知识点汇总 1. 配置 WebSocket 添加依赖 进入maven官网, 搜索spring-boot-starter-websocket&#xff0c;选择版本, 然后把依赖复制到pom.xml的dependencies标签中 配置 WebSocket 创建一个配置类 WebSocketConfig&…

管理无线物联网设备和连接的增长

将项目(或产品)规模化从来不是一件容易的事。然而&#xff0c;随着蜂窝无线物联网的部署&#xff0c;增长挑战尤其令人生畏。 为什么?因为如果不增加复杂性&#xff0c;就无法发展无线物联网部署。复杂性随着物联网而扩大&#xff0c;随着每一个新设备、每一个新的运营商协议…

Python酷库之旅-第三方库Pandas(024)

目录 一、用法精讲 61、pandas.to_numeric函数 61-1、语法 61-2、参数 61-3、功能 61-4、返回值 61-5、说明 61-6、用法 61-6-1、数据准备 61-6-2、代码示例 61-6-3、结果输出 62、pandas.to_datetime函数 62-1、语法 62-2、参数 62-3、功能 62-4、返回值 62-…

C语言指针超详解——强化篇

C语言指针系列文章目录 入门篇 强化篇 文章目录 C语言指针系列文章目录1. assert 断言2. 指针的使用和传址调用2. 1 strlen的模拟实现2. 2 传值调用和传址调用 3. 数组名的理解4. 使用指针访问数组5. 一维数组传参的本质6. 冒泡排序7. 二级指针8. 指针数组9. 指针数组模拟实现…

嵌入式智能手表项目实现分享

简介 这是一个基于STM32F411CUE6和FreeRTOS和LVGL的低成本的超多功能的STM32智能手表~ 推荐 如果觉得这个手表的硬件难做,又想学习相关的东西,可以试下这个新出的开发板,功能和例程demo更多!FriPi炸鸡派STM32F411开发板: 【STM32开发板】 FryPi炸鸡派 - 嘉立创EDA开源硬件平…

缓存的击穿及解决方案

定义及图解 缓存击穿的意思是对于设置了过期时间的key&#xff0c;缓存在某个时间点过期的时 候&#xff0c;恰好这时间点对这个Key有大量的并发请求过来&#xff0c;这些请求发现缓存过期一般都会从后端 DB 加载数据并回设到缓存&#xff0c;这个时候大并发的请求可能会瞬间把…

使用Godot4组件制作竖版太空射击游戏_2D卷轴飞机射击-标题菜单及游戏结束界面(九)

文章目录 开发思路标题菜单界面标题菜单脚本代码结束菜单界面结束菜单脚本代码 使用Godot4组件制作竖版太空射击游戏_2D卷轴飞机射击&#xff08;一&#xff09; 使用Godot4组件制作竖版太空射击游戏_2D卷轴飞机射击-激光组件&#xff08;二&#xff09; 使用Godot4组件制作竖版…