【C++类】

news2024/12/23 14:08:30

目录

  • 前言
  • 类的定义
  • 类的访问限定符及封装
    • 访问限定符
    • 封装
  • 类的大小
    • 为什么需要内存对齐
    • 为什么成员函数不占用类的内存?
    • 为什么空类的大小是1个字节?

前言

今天是少年正式认识"对象"的第一天,虽然此"对象"非彼对象,但是少年也想好好的与你认识认识,所以少年在这里先跟你打个招呼。
blog.csdnimg.cn/6c5d5eed216445669dfadb9442adadb8.png)
我们都知道豹子、老虎、猫…都是猫科动物。这里我们用猫科动物来作为这些动物的,而豹子、老虎、猫是这个类下的具体动物即对象。在生活中有了类与对象的概念我们就可以很简单描述一个复杂的事物。比如:王者荣耀是一个我方英雄与敌方英雄的塔防游戏。英雄是类,塔也是类,用了两个类就简单的描述了几百万人玩的游戏。试想一下假如没有类的概念你该怎么描述呢?
而在C++中为了更好的"表达"也引入了对象的概念(祖师爷666)。

类的定义

C++中使用关键字 class 来定义类, 其基本形式如下:

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

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

  1. 声明和定义全部放在类体中,需注意:成员函数如果在类中定义,编译器可能会将其当成内联函数处理。
class Hero
{
public:
	//英雄的1技能
	int func1()
	{
		return 0;
	}
	//英雄的2技能
	int func2()
	{
		return 0;
	}
	//英雄的3技能
	int func3()
	{
		return 0;
	}
	//英雄的4技能
	int func4()
	{
		return 0;
	}
private:
	//英雄名字
	char name[20];
	//英雄血条
	int Hp;
};

2.类声明放在.h文件中,成员函数定义放在.cpp文件中,注意:成员函数名前需要加类名::
Tower.h文件

#pragma once
class Tower
{
public:
	//塔的攻击功能
	int Attack();
private:
	//塔的名字
	char name[20];
	//塔的血量
	int Hp;
	//塔的伤害值
	int DamageValue;
};

Tower.cpp文件

#include"Tower.h"
int Tower::Attack()
{
	return 0;
}

一般情况下,更期望采用第二种方式。好处现在可能不太明显,后面代码量上去后可能自己就有了体会,特别是还加了继承与多态。

类的访问限定符及封装

访问限定符

在这里插入图片描述
【访问限定符说明】

  • public修饰的成员在类外可以直接被访问
  • protected和private修饰的成员在类外不能直接被访问(此处protected和private是类似的)
  • 访问权限作用域从该访问限定符出现的位置开始直到下一个访问限定符出现时为止
  • 如果后面没有访问限定符,作用域就到 } 即类结束。
  • class的默认访问权限为private,struct为public(因为struct要兼容C)

封装

C++中面向对象的特性有三:封装、继承、多态。学到这里代表少年面向对象的思想刚刚开始入门了。
封装:将数据和操作数据的方法进行有机结合,隐藏对象的属性和实现细节,仅对外公开接口来和对象进行交互。假设你是王者荣耀的实现团队的leader,你希望你的团队写出在英雄放技能时可以修改英雄固定的属性值的代码吗?可能的不行的。
通过需要访问权限来隐藏对象内部实现细节,控制哪些方法可以在类外部直接被使用就是封装。

类的大小

前面在学习C语言的时候知道了结构体大小的计算,这里面主要涉及到内存对齐,同样类的大小计算也要涉及到内存对齐。比如:
在这里插入图片描述
那么为什么要有内存对齐规则呢?上次在C语言里没有细说,这次借助C++的类在这里展开一下。

为什么需要内存对齐

  • 首先不是所有的硬件平台都能访问任意地址上的数据。
  • 其次某些硬件平台只能只在某些地址访问某些特定类型的数据,否则抛出硬件异常,及遇到未对齐的边界直接就不进行读取数据了。
  • 最后为了代码的可移植性,和提升CPU访问内存的效率,所以结构体一定要内存对齐。本质:空间换区时间的做法。
    在这里插入图片描述
    cpu的内存由于硬件的原因是一块一块的,块的大小可能是2字节、4字节、8字节取决于硬件,因此cpu在读取内存时是一块一块的读取的。不可以随机访问某一个地址,但是可以随机访问某个倍数倍的地址。比如:
    在这里插入图片描述
    最后对比一下对齐与不对齐的读取效率。如图:
    在这里插入图片描述

为什么成员函数不占用类的内存?

话不多说直接上图:
在这里插入图片描述
在这里插入图片描述
通过2张图可以发现类的大小是真的与类内的成员函数无关。但是这是为什么呢?这主要与类的存储方式有关。如图:
在这里插入图片描述
成员函数不像成员属性那么特殊(每个对象的属性是独一无二的),成员函数就像是对象的方法你想用直接去公共代码区调用就好,不用每个对象都"带着"这样浪费空间。

为什么空类的大小是1个字节?

直接上图:
在这里插入图片描述
按道理应该是0呀?为什么是1呢?假设是0字节大小,即不在内存上存储。那么少年问你,对一个类取地址这个操作犯毛病吗?应该是合理的哟,但是它都不在内存上了它的地址是多少呢?所以为了出现这么的情况,编译器给了一个字节的空间来存储这个类,来证明这个类存在过。
在这里插入图片描述

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

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

相关文章

使用Jmeter进行http接口测试

前言: 本文主要针对http接口进行测试,使用Jmeter工具实现。 Jmter工具设计之初是用于做性能测试的,它在实现对各种接口的调用方面已经做的比较成熟,因此,本次直接使用Jmeter工具来完成对Http接口的测试。 一、开发接口…

经典算法之快速排序

快速排序 【思想】选择一个元素作为标准,分别将小于该元素的元素放入该元素左边,大于该元素的元素放到该元素的右边,接下来分别对左右两边区间进行同样操作,直到整个数组有序。 【例子】 上述是一个未排序的数组,首…

前端三个小妙招

整理下本人在工作中撸代码遇到的一些刚看时一脸懵逼,实则很简单就能解决的小妙招,希望对大家有所帮助哟~ 伪元素动态改变其样式 我们都用过伪元素,什么::before,::after啊这些等等,但是他们都不会直接在代码里html中生成标签&am…

使用MASA全家桶从零开始搭建IoT平台(一)环境准备

前言 本系列文章以IoT开发小白的角度,从零开始使用.Net为主要技术搭建一个简单的IoT平台,由于是入门系列,所有代码以围绕IoT基础业务场景为主,不会涉及DDD等设计思想。 架构图 这里是我们整个IoT平台的架构图。 一、设备接入…

深入了解Synchronized同步锁的优化

大家好,我是易安!今天我们来聊一下Synchronized同步锁的优化。 在并发编程中,多个线程访问同一个共享资源时,我们必须考虑如何维护数据的原子性。 在JDK1.5之前,Java是依靠Synchronized关键字实现锁功能来做到这点的。…

Java核心技术 卷1-总结-10

Java核心技术 卷1-总结-10 通配符类型通配符概念通配符的超类型限定无限定通配符通配符捕获 通配符类型 通配符概念 通配符类型中&#xff0c;允许类型参数变化。 例如&#xff0c;通配符类型Pair<? extends Employee>表示任何泛型Pair类型&#xff0c;它的类型参数是…

LeetCode_动态规划_中等_1105.填充书架

目录 1.题目2.思路3.代码实现&#xff08;Java&#xff09; 1.题目 给定一个数组 books &#xff0c;其中 books[i] [thicknessi, heighti] 表示第 i 本书的厚度和高度。你也会得到一个整数 shelfWidth。 按顺序将这些书摆放到总宽度为 shelfWidth 的书架上。 先选几本书放…

机器学习基本模型与算法在线实验闯关

机器学习基本模型与算法在线实验闯关 文章目录 机器学习基本模型与算法在线实验闯关一、缺失值填充二、数据标准化三、支持向量机分类模型及其应用四、逻辑回归模型及其应用五、神经网络分类模型及其应用六、线性回归模型及其应用七、神经网络回归模型及其应用八、支持向量机回…

AIGC跨过奇点时刻,亚马逊云科技展露新峥嵘

AIGC是云计算的Game changer&#xff0c;将从根本上改变云计算乃至整个科技行业的游戏规则&#xff0c;作为云计算行业的Game Rulemaker&#xff0c;亚马逊云科技也展露出新的峥嵘。4月13日&#xff0c;亚马逊云科技宣布推出生成式AI新工具&#xff0c;包括Amazon Bedrock和Ama…

Java核心技术 卷1-总结-11

Java核心技术 卷1-总结-11 Java 集合框架将集合的接口与实现分离Collection接口迭代器泛型实用方法集合框架中的接口 Java 集合框架 将集合的接口与实现分离 Java集合类库将接口&#xff08;interface&#xff09;与实现&#xff08;implementation&#xff09;分离。 例如队…

把Windows装进内存条里,提前感受超越PCIe 6.0固态的顶级体验

这两年电脑内存条是越来越白菜价了&#xff0c;看到大伙儿慢慢富足起来的内存容量&#xff0c;小忆是由衷地感到高兴。 不过话说&#xff0c;动不动 32G、64G 内存你真能用得完吗&#xff1f;为了榨干大家真金白银买来的空闲内存价值。 咱这期整个骚操作——将 Windows 11 系统…

虚拟机安装linux系统centos(保姆级)

虚拟机安装linux系统centos 1.软硬件准备2.虚拟机准备1.打开VMware选择新建虚拟机2.典型安装与自定义安装3.虚拟机兼容性选择4.选择稍后安装操作系统5.操作系统的选择7.处理器与内存的分配8.网络连接类型的选择&#xff0c;网络连接类型一共有桥接、NAT、仅主机和不联网四种。9…

ArcMap气温数据插值处理

一、插值数据处理 1.先把气温excel在excel中另存为气温.csv&#xff08;网盘链接中有转好的csv文件&#xff09;&#xff0c;导入数据江苏.shp和jiangsustation.shp 和气温.csv 数据在文末百度网盘链接中 2.打开jiangsustation.shp的属性表&#xff0c;连接与字段-连接-连接的…

RabbitMQ的五种工作模式

目录 前言介绍 &#xff08;1&#xff09;启动RabbitMQ &#xff08;2&#xff09;账户管理 一、简单模式 &#xff08;1&#xff09;概念 &#xff08;2&#xff09;生产者代码 &#xff08;3&#xff09;消费者代码 二、工作队列模式 &#xff08;1&#xff09;概念…

LLVM编译流程

一、LLVM 1.1 LLVM概述 LLVM是构架编译器(compiler)的框架系统,以C编写而成,用于优化以任意程序语言编写的程序的编译时间(compile-time)、链接时间(link-time)、运行时间(run-time)以及空闲时间(idle-time),对开发者保持开放,并兼容已有脚本.LLVM计划启动于2000年,最初由美国…

Dynamics 365 开启 Modern advanced find后如何创建个人视图

本篇是自己在新的环境被新的高级查找晃的没找到如何创建个人视图而发。如何在老的高级查找页面创建这里就不表了。 D365 2022 Wav1后有了新的feature叫Modern advanced find&#xff0c;开启方式如下&#xff0c;进Power Platform的管理中心&#xff0c;找到你对应的环境&#…

Java核心技术 卷1-总结-6

Java核心技术 卷1-总结-6 接口示例接口与回调Comparator接口对象克隆 lambda表达式为什么引入lambda表达式lambda表达式的语法 接口示例 接口与回调 回调&#xff08;callback&#xff09;是一种常见的程序设计模式。在这种模式中&#xff0c;可以指出某个特定事件发生时应该…

珍藏多年的MySQL函数大全笔记,掌握数据库真不难

做程序员的谁会离得开数据库呢&#xff1f;今天就来分享一下我整理的MySQL的常用函数&#xff0c;基本上囊括了平时要用的函数&#xff0c;它们已经陪我走过了不少年头了&#xff0c;风里来雨里去&#xff0c;缝缝补补又几年&#xff0c;希望能帮到你们&#xff01; 如果数据库…

短视频app开发:如何实现视频直播功能

短视频源码的实现 在短视频app开发中&#xff0c;实现视频直播功能需要借助短视频源码。短视频源码可以提供一个完整的视频直播功能模块&#xff0c;包括视频采集、编码、推流等。因此&#xff0c;我们可以选择一些开源的短视频源码&#xff0c;例如LFLiveKit、ijkplayer等&am…

Nacos简介 安装 配置

简介 什么是注册中心 注册中心在微服务项目中扮演着非常重要的角色&#xff0c;是微服务架构中的纽带&#xff0c;类似于通讯录&#xff0c;它记录了服务和服务地址的映射关系。在分布式架构中&#xff0c;服务会注册到这里&#xff0c;当服务需要调用其它服务时&#xff0c;…