类和对象初识

2023-05-16

类和对象初识

  • 类的由来
  • 类的定义
  • 类的特性
    • 封装
    • 访问限定符
  • 类的定义方法
    • 声明和定义全部放在类体中
    • 声明放在.h文件中,类的定义放在.cpp文件中
    • 类对象的大小
  • 内存对齐规则

类的由来

在C语言中我们有自定义类型的struct,然而在C++中C++兼容C里面的用法,同时struct在C++中升级成了类。C++类和C语言中的结构体不同的是除了可以定义变量还可以定义方法/函数。例如:

#include<string>
#include<iostream>
using namespace std;
struct Student
{
	//成员变量
	char _name[10];
	int _age;
	int _id;
	//成员方法
	void Init(const char* name, int age, int id)
	{
		strcpy(_name, name);
		_age = age;
		_id = id;
	}
	void Print()
	{
		cout << _name << endl;
		cout << _age << endl;
		cout << _id << endl;
	}
};

int main()
{
	struct Student s1;//C中定义结构体的用法
	Student s2;//c++定义类的用法 Student 既是类名也是类型
	//strcpy(s1._name, "李四");
	//s1._age = 10;
	//s1._id = 0;

	//strcpy(s2._name, "张三");
	//s2._age = 20;
	//s2._id = 1;
	s1.Init("zhangsan",10,0);
	s2.Init("李四" ,20 ,1);
	s1.Print();
	s2.Print();
	return 0;
}

C++中更喜欢用class代替struct但是C++兼容C的用法

类的定义

class classname
{
	//在这里定义/声明成员变量或成员函数
};

class为定义类的关键字,classname为类的名字,{}中为类的主体

类的特性

封装

面向对象的语言一般有三大特性:封装,继承,多态,其中类体现了封装的特性:
1、数据和方法都放到了一起
2、将数据和操作数据的方法进行有机结合,隐藏对象的属性和实现细节,仅对外公开接口来和对象进行交互。
3、封装的本质是一种管理
4、可以给用户访问的定义为公有,不可以进行访问的内容定义为私有。

访问限定符

一般在定义类的时候,建议明确定义访问限定符,不使用默认定义。那么什么是访问限定符呢?
访问限定符是用来规定类中成员性质的一种标识符,作用范围从一个访问限定符开始到下一个访问限定符或者到类结束,那么有哪些访问限定符呢?
1、public(公有):公有修饰的成员可以在类外面进行访问
2、protected(保护)和private(私有)修饰的成员不能在类外面进行访问
3、访问权限的作用域从该访问限定符出现的位置开始直到下一个访问限定符出现为止
4、class的默认访问权限为private(私有),struct的为public(公有)(为了兼容C)

class Student
{
private:
	//成员变量
	char _name[10];
	int _age;
	int _id;
public:
	//成员方法
	void Init(const char* name, int age, int id)
	{
		strcpy(_name, name);
		_age = age;
		_id = id;
	}
	void Print()
	{
		cout << _name << endl;
		cout << _age << endl;
		cout << _id << endl;
	}
};

int main()
{
	Student s1;
	//s1._name;//报错 无法直接访问
	return 0;
}

类的定义方法

声明和定义全部放在类体中

class Student
{
private:
	//成员变量
	char _name[10];
	int _age;
	int _id;
public:
	//成员方法
	void Init(const char* name, int age, int id)
	{
		strcpy(_name, name);
		_age = age;
		_id = id;
	}
	void Print()
	{
		cout << _name << endl;
		cout << _age << endl;
		cout << _id << endl;
	}
};

声明放在.h文件中,类的定义放在.cpp文件中

class Student//头文件中
{
private:
	//成员变量
	char _name[10];
	int _age;
	int _id;
public:
	//成员方法
	void Init(const char* name, int age, int id);
	void Print();
};

void Student::Print()//cpp文件中定义函数方法,需要使用 :: 作用域解析符指明成员属于哪个类域。
{
	cout << _name << endl;
	cout << _age << endl;
	cout << _id << endl;
}

类对象的大小

class Student
{
private:
	//成员变量
	char _name[10];
	int _age;
	int _id;
public:
	//成员方法
	void Init(const char* name, int age, int id)
	{
		strcpy(_name, name);
		_age = age;
		_id = id;
	}
	void Print()
	{
		cout << _name << endl;
		cout << _age << endl;
		cout << _id << endl;
	}
};

int main()
{
	Student s1;
	cout << sizeof(s1) << endl;//20
	cout << sizeof(Student) << endl;//20
	return 0;
}

一个类的大小,实际就是该类中”成员变量”之和(不计算成员函数大小),当然也要进行内存对齐,注意空类的大小,空类比较特殊,编译器给了空类一个字节来唯一标识这个类。

内存对齐规则

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

类和对象初识 的相关文章

  • 操作系统基础知识详解

    作者简介 哪吒 CSDN2022博客之星Top1 CSDN2021博客之星Top2 多届新星计划导师 博客专家 专注Java硬核干货分享 立志做到Java赛道全网Top N 本文收录于 Java基础教程系列 目前已经700 订阅 CSDN最
  • 【SUSE Linux kernel版本升级】SUSE Linux Enterprise Server 12 SP5

    安装完SUSE Linux操作系统后 xff0c 正常会将SUSE Linux的kernel升级至最新版本 本次实验环境是SUSE Linux Enterprise Server 12 SP5 xff1a cat etc release S
  • 一个用消息队列 的人,不知道为啥用 MQ,这就有点尴尬

    消息队列 为什么写这篇文章 博主有两位朋友分别是小A和小B 小A xff0c 工作于传统软件行业 某社保局的软件外包公司 xff0c 每天工作内容就是和产品聊聊需求 xff0c 改改业务逻辑 再不然就是和运营聊聊天 xff0c 写几个SQL
  • iOS开发之NSMutableParagraphStyle富文本

    在iOS开发中 xff0c 常常会有一段文字显示不同的颜色和字体 xff0c 或者给某几个文字加删除线或下划线行间距的需求 就需要富文本来实现 一 实例化方法和使用方法 NSMutableAttributedString detailStr
  • Ubuntu一直卡死的问题(18.04)

    昨天今天Ubuntu突然出现了一个问题 xff0c 就是每次开机不到5分钟 xff0c 随便点击一下浏览器或者其他的地方就会卡住 xff0c 但是鼠标可以移动 xff0c 就是无法点击 xff0c 而且等待一段时间后会出现黑屏然后提示如下图
  • 作为一个普通的程序员,到底应不应该转型AI工程师?

    动不动就是50万的毕业生年薪 xff0c 动不动就是100万起步价的海归AI高级人才 xff0c 普通员到底应不应该转型AI工程师 xff0c 普通程序员到底应该如何转型AI工程师 xff1f 下面就分享几个特别典型的普通程序员成功转型AI
  • 编译原理第二章习题

    一 填空题 假设G是一个文法 xff0c S是文法的开始符号 xff0c 如果S 61 gt x xff0c 则称x是 句型 文法G产生的 句子 的全体是该文法描述的语言 文法 G S S AB A aA B bBc bc描述的语言 L G
  • 推荐几个免费好用的搜书网站

    小不点搜索 地址 xff1a https www xiaoso net 介绍 xff1a 一个公益的网站不收费 我用来搜索过图书 xff0c 其他资源还没搜索过 xff0c 用起来速度挺快的 2 java1234 地址 http www j
  • 推荐一些好用的APP

    南瓜影视 链接 xff1a https ng33 app channelCode 61 share88 appkey 61 ayo1id amp recommend 61 5708550 没有广告 xff0c 有电视版 xff0c 手机版
  • 虚拟机的初始化设置的磁盘空间太大,进行缩小

    xff08 如果你的磁盘文件是多文件的直接跳到第二步 xff09 1 将但磁盘文件分解为多磁盘文件 在虚拟机安装目录下 xff0c 执行该命令 vmware vdiskmanager exe r 你的虚拟机磁盘文件 vmdk t 1 spa
  • yum包查找网站

    https pkgs org http rpm pbone net index php3
  • swagger3 +srpingsecurity

    引入jar包 参考swagger官网http springfox github io springfox docs current quick start guides span class token operator lt span s
  • java移除数组中的某个元素

    span class token keyword package span com span class token punctuation span example span class token punctuation span de
  • CentOS7下使用YUM安装MySQL5.6

    xff08 1 xff09 检查系统中是否已安装 MySQL rpm qa grep mysql 返回空值的话 xff0c 就说明没有安装 MySQL 注意 xff1a 在新版本的CentOS7中 xff0c 默认的数据库已更新为了Mari
  • Linux性能优化

    Linux性能优化 来源 xff1a https www ctq6 cn linux E6 80 A7 E8 83 BD E4 BC 98 E5 8C 96 性能优化 性能指标 高并发和响应快对应着性能优化的两个核心指标 xff1a 吞吐和
  • 导入sql文件报错:Row size too large (>8126)

    报错异常 xff1a 1118 Row size too large gt 8126 Changing some columns to TEXT or BLOB or using ROW FORMAT 61 DYNAMIC or ROW F
  • Jlink工具下的RTT调试应用

    单片机开发过程中 xff0c 除了debug调试之外 xff0c 很多人都是通过打印信息进行调试 xff0c 一般都会分配出来一个调试的串口 xff0c 如果你的单片机使用jlink烧录器 xff0c 那么可以使用调试工具 RTT来代替串口
  • 经典软件设计模型 - 生产者消费者模型

    简介 这里就不具体介绍了 xff0c 网上一堆关于生产者消费者模式的介绍 xff0c 这是一个常用的设计方法 xff0c 只要牵扯多个线程之间协作一般就需要这个设计方法 xff0c 简单意思就是有个缓冲负责两个线程之间的交流 xff0c 一
  • Windows 下 VS Code Remote-Development(ssh) 插件的安装和配置

    本文主要介绍在 VS Code Insider 上如何通过 ssh 的方法连接接到远程机器 xff08 必须是 Linux 系统 xff09 提高开发效率 配置的过程如下 xff1a 1 远程主机安装 ssh server span cla
  • potplayer如何设置以一帧一帧的逐帧播放播放?

    PotPlayer是一款非常专业的视频播放器 自带专业的编解码器 xff0c 方便快捷 xff0c 可观看任何格式视频文件 xff0c 功能非常强大 PotPlayer播放器启动速度快 xff0c 播放稳定 xff0c 还支持给视频加字幕

随机推荐

  • Ubuntu18.04中设置使用root用户登录图形界面

    1 打开配置文件 sudo vim usr share lightdm lightdm conf d 50 ubuntu conf 2 在最后一行添加greeter show manual login 61 true greeter sho
  • Android5.0+ Camera专栏终结

    本文均属自己阅读源码的点滴总结 xff0c 转账请注明出处谢谢 欢迎和大家交流 qq 1037701636 email gzzaigcn2009 64 163 com Software xff1a 系统源码Android5 1 寥寥几笔写在
  • Android Camera从Camera HAL1到Camera HAL3的过渡(已更新到Android6.0 HAL3.3)

    本文均属自己阅读源码的点滴总结 xff0c 转账请注明出处谢谢 欢迎和大家交流 qq 1037701636 email gzzaigcn2009 64 163 com Software xff1a 系统源码Android5 1 1 Andr
  • Android Camera HAL3中预览preview模式下的数据流

    本文均属自己阅读源码的点滴总结 xff0c 转账请注明出处谢谢 欢迎和大家交流 qq 1037701636 email gzzaigcn2009 64 163 com Software xff1a 系统源码Android5 1 前沿 xff
  • 【1】RNA-seq 测序数据之Hisat2比对-featurecount计算-EdgeR分析

    一 拿到 测序数据之后 xff0c 首先选择参考基因组及比对工具进行比对 1 Hisat比对 xff1a xff08 6个G的测序数据耗时20分钟 xff0c 比对率78 4 xff09 物种差异度大导致比对率低 build index h
  • Android Camera API2中采用CameraMetadata用于从APP到HAL的参数交互

    本文均属自己阅读源码的点滴总结 xff0c 转账请注明出处谢谢 欢迎和大家交流 qq 1037701636 email gzzaigcn2009 64 163 com Software xff1a 系统源码Android5 1 前沿 xff
  • Android.mk中LOCAL_MODULE_CLASS对LOCAL_MODULE_PATH 的影响

    LOCAL MODULE CLASS用于制定LOCAL MODULE PATH的路径所在 如果在Android mk没有直接明确LOCAL MODULE PATH 的话 xff0c 需要通过以下规则来自动生成base rules mk xf
  • PRODUCT_COPY_FILES的深入理解,为何不能在Android.mk使用

    PRODUCT COPY FILES本质是和定义产品的AndroidProducts mk xff08 get all product makefiles来获取系统中所有AndroidProducts mk 文件路径 xff09 联系在一起
  • linux驱动开发经验逐步积累2

    注 xff1a 笔记多少会有问题 xff0c 多多包涵 只是作为一个记录而已 1 cdev add的核心思想 cdev add允许添加一个字符设备到内核 xff0c 其核心是kobj map xff0c 也可以添加一个字符设备集合 xff0
  • 记录下在csdn那些年里所使用的博客座右铭

    xfeff xfeff 2016 xff0c 认认真真做事 xff0c 脚踏实地生活 路漫漫 xff0c 意不变 xff0c 求静 xff0c 求心 xff0c 求进 2017 xff0c 重新开始 xff0c 从心开始 xff0c 从家开
  • 多寄存器寻址指令ldmia/ldmib和ARM存储器访问指令——多寄存器存取

    多寄存器和堆栈寻址的用法 xff1a 多寄存器寻址 xff1a LDMIA xff0c LDMIB xff0c STMIA xff0c STMIB xff0c LDMDA xff0c LDMDB xff0c STMDA xff0c STMD
  • 使用CCS5.1导入的3.3工程编译错误lib/subdir_vars.mk:11: *** missing separator. Stop.

    D Program Files CCS5 1 ccsv5 utils bin gmake k all lib subdir vars mk 11 missing separator Stop TI方面说是CCS5 1的BUG xff0c 在
  • 写给我的2013

    前沿 xff1a 代码看的累了 xff0c 在新的一年终于可以找点时间来回忆我的2013 想着要写点什么 xff0c 可是又没有什么可以写 因为回忆无非就是夹杂着些许痛苦与欢乐 写给我的2013 家 生活 xff1a 2013年 xff0c
  • 写给我的2014——也写给我即将逝去的研究生生涯

    前言 xff1a 2014 1在写着代码的时写下了回忆 xff0c 2015 1在码着论文的时候开始写起消逝的2014 细细回忆 xff0c 真是又是那句老话 xff0c 时间过得真快 xff0c 1年过去了 xff1b 更快的是竟然都要毕
  • Oracle官网下载历史版本软件

    一 分享一个Oracle官网下载各种软件的网址 https edelivery oracle com osdc faces SoftwareDelivery 这个网址是Oracle官网专门下载软件的地址 xff0c 下载软件过程如下 xff
  • 技术盘点:消息中间件的过去、现在和未来

    作者介绍 xff1a 林清山 xff08 花名 xff1a 隆基 xff09 操作系统 数据库 中间件是基础软件的三驾马车 xff0c 而消息队列属于最经典的中间件之一 xff0c 已经有30多年的历史 其发展主要经历了以下几个阶段 xff
  • C语言小游戏——扫雷

    上次我们用C语言实现了一个三子棋的小游戏 xff0c 这次我们同样使用C语言来实现扫雷这个经典的小游戏 首先 xff0c 在开始编程之前还是先整理一下我们的编程思路 xff1a 一 菜单打印 xff1a 和上次实现三子棋的操作类型 xff0
  • 缺省参数讲解

    缺省参数 缺省参数定义缺省参数分类1 全缺省参数 xff1a 2 半缺省参数 xff1a 注意事项 缺省参数定义 缺省参数作为C 43 43 不同于C语言新增的一种语法功能 xff0c 他的作用是在声明或定义函数时为参数指定的一个默认值 x
  • Linux下的权限

    Linux下的权限 用户分类文件类型具体文件类型 基本权限root用户 xff1a 修改权限使用方法 xff1a 通过8进制数字更改权限 对于文件 xff0c 权限的意义读权限写权限运行权限 对于目录权限的意义 更改文件拥有者 所属组cho
  • 类和对象初识

    类和对象初识 类的由来类的定义类的特性封装访问限定符 类的定义方法声明和定义全部放在类体中声明放在 h文件中 xff0c 类的定义放在 cpp文件中类对象的大小 内存对齐规则 类的由来 在C语言中我们有自定义类型的struct xff0c