C++类和对象 第二级初阶

news2024/9/22 20:35:36

目录

面向过程和面向对象

类是什么?

类的定义

1.声明和定义都放在类中

2.声明和定义分离

类的访问限定符

类的封装

类的作用域

类的实例化

类对象存储

结构体内存对齐规则


面向过程和面向对象

c语言是面向过程的

c++是面向对象的

怎么理解?

面向过程,我们用抖音有各种功能,最主要的是发视频和看视频。开发功能 发视频和看视频这两个行为是面向过程的。

面向对象,则是发视频的作者,和看视频的读者。根据这两个群体,来开发功能。就像我们大众是读者,我们不止可以刷视频还可以看直播,还可以点赞关注,这些功能都是放在读者类的。而对于作者发视频,看数据这些功能是放到作者类的。这就是面向对象。

 所以说面向对象是较为宏观的,面向过程则就是较微观的。把对应的过程封装到对应的对象

类是什么?

我们在c语言里学过结构体 struct。但是在c语言中struct中只能定义变量。

而在c++以后有了面向对象的说法,所以类(对象)出现了他也是struct同时也可以用class(常用)。但不同点是类中是可以定义函数(过程)的

类的定义

class className
{
	//类体:由成员变量和成员函数组成

};  //注意后面的分号

这是类的写法和struct一样。


1.声明和定义都放在类中

将函数的定义和声明都放在类中 

2.声明和定义分离

 在头文件中将函数声明

在源文件中对函数的实现。

注意:定义和声明分离时要指定出是在哪一个类中

类的访问限定符

c++实现封装的方式:用类把对象的属性(变量)和方法(函数)都放到类中。然后再用访问限定符设置权限,选择性的把部分接口提供给用户。就像淘宝你可以改你自己店铺的图片,但你影响不了网页的整体布局。由权限决定的。

 【限定符说明】

1.public里的接口外部可以用。

2.protected 和 private 的接口外部不能使用,区别在于 子类中能使用的是protected,不能使用的是private。

3.class 的默认限定符是private,struct 默认是 public(兼容c语言中的结构体)

4.权限区域以一个访问符开始,另一个访问符结束。

class Person
{
//private://默认的private(如果没有写访问符则person里的任何东西都拿不出去,因为private)
    //.....
    //里面的代码到下面的public,是private的区间
    //
public:
	//显示基本信息
	void ShowInfo();
private:
	char* _name;  //姓名
	char* _sex;   //性别
	int _age;     //年龄
};

 注意:访问限定符只在编译中有效,因为在编译过程中会检查是否有越界行为。当映射到内存后,这个限制就没了。类的实例(对象)通常以一个连续的内存块形式存在,所以没有限制

面试题:C++中的struct和class的区别是什么?

答案:1.struct充当了两个角色,1.结构体2.类。而class只是类的关键词。

           2.struct默认的访问限定是public(兼容c语言结构体),class的是private。

类的封装

封装就是把数据和使用数据的方法放到类中。隐藏其中细节,对外开放部分接口,来操作对象。

很容易想,你是刷抖音的,你只要知道刷就行了,你不可能说在你手机上你还可以把抖音的功能改了。这也变相说明了封装就是一种管理,管理数据不被随意修改(因为有访问限定符)。

类的作用域

class Person
{
public:
	//显示基本信息
	void ShowInfo();
private:
	char* _name;  //姓名
	char* _sex;   //性别
	int _age;     //年龄
};

//这里需要指定ShowInfo是属于Person这个类域
void Person::ShowInfo()
{
	cout << _name << "-" << _sex << "-" << _age << endl;
}

作用域:我们平常说的全局和局部就是作用域,全局变量,局部变量。

类就是定义了一块新的域。我们要使用其中的接口和变量时,需要用"::"来指定你这个接口或函数是哪一个域的。

类的实例化

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

实例化,就如字面意义一样,你定义好了一个类那就是虚的因为只是一个设计。实例化就是让虚的变实,就是将设计造出来。很容易想:造车子设计图纸是虚的,造出来车子能跑了才是实的。

1.只有实例化后你才有内存,你虚的时候什么都没有,实的时候你的车子才是有体积的。

2.一个类可以实例化出多个对象。很容易理解,你是车子制造商,一张图纸为模版就可以造出一堆。

上图就是怎么实例化。 

类对象存储

类中既有函数又有成员变量。那这样怎么算呢?

class Person
{
public:
	//显示基本信息
	void ShowInfo()
	{
		cout << _name << "-" << _sex << "-" << _age << endl;
	}
public:
	char* _name;  //姓名
	char* _sex;   //性别
	int _age;     //年龄
};

因为我们一个类可以创建多个对象(实例化),对于不同的对象,里面的变量可能不同,但是函数是相同的(使用方法)。就像抖音,每个人的关注和喜欢不同,但是功能刷抖音看视频是相同的。

所以类实例化后,成员变量每个对象单独一份,但是函数是在公共代码区里共用的。

// 类中既有成员变量,又有成员函数 最终是4字节
class A1 {
public:
	void f1(){}
private:
	int _a;
};
// 类中仅有成员函数  最终是1字节
class A2 {
public:
	void f2() {}
};
// 类中什么都没有---空类  最终是1字节
class A3
{};

 所以一个对象的大小就是成员变量的大小,空类和只有函数的类,只有1字节。

这是为了标识,就算这个类什么都没有,但是被实例化后就代表这个类是真实存在的,要给1字节用来占位,表示存在。

结构体内存对齐规则

  1. 第一个成员在与结构体变量偏移量为0的地址处。(即结构体的首地址处,即对齐到0处)
  2. 其他成员变量要对齐到某个数字(对齐数)的整数倍的地址处。
  3. 结构体的总大小为最大对齐数(每个成员变量都有一个对齐数)的整数倍。
  4. 如果嵌套了结构体,嵌套的结构体对齐到自己的最大对齐数的整数倍处,结构体的整体大小就是所有最大对齐数(含嵌套结构体的对齐数)的整数倍。

对齐数 = 该结构体成员变量自身的大小与编译器默认的一个对齐数的较小值。

结构体内存对齐详解请看->点点点!!!

隐藏彩蛋  this指针详解-->点点点!!!

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

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

相关文章

外包干了三年,快要废了。。。

先说一下自己的情况&#xff0c;普通本科&#xff0c;在外包干了3年多的功能测试&#xff0c;这几年因为大环境不好&#xff0c;我整个人心惊胆战的&#xff0c;怕自己卷铺盖走人了&#xff0c;我感觉自己不能够在这样蹉跎下去了&#xff0c;长时间呆在一个舒适的环境真的会让一…

【智能终端】HBuilder X 与微信开发者工具集成与调试实战

目录 1. 需求和理解库、框架、平台 1.1 需求 1.2 理解 2.3 库、框架、平台 2.3.1 库&#xff08;Library&#xff09; 2.3.2 框架&#xff08;Framework&#xff09; 2.3.3 平台&#xff08;Platform&#xff09; 2.3.4 总结 2. 使用 HBuilder X 创建第一个 uni-app 应…

MATLAB绘图基础7:单变量图形绘制

参考书&#xff1a;《 M A T L A B {\rm MATLAB} MATLAB与学术图表绘制》(关东升)。 7.单变量图形绘制 7.1 直方图 直方图 ( H i s t o g r a m ) ({\rm Histogram}) (Histogram)&#xff1a;一种常用于可视化数据分布的图形类型&#xff0c;用于显示数据集中各数值范围的频率…

STM32G474RE之RTC

STM32G474RE之RTC使用HAL库实现RTC时间配置&#xff0c;以及报警配置&#xff0c;支持双路报警。 1、STM32G474RE的RTC晶振引脚&#xff1a; OSC32_IN为PC14&#xff0c;OSC32_OUT为PC15&#xff1b; 2、Vbat引脚 Vbat引脚是用来给外部晶振LSE和备份寄存器提供电源。当没有“…

9.11 QT ( Day 4)

一、作业 1.Widget.h #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QTimerEvent> //定时器类 #include <QTime> #include <QtTextToSpeech> //文本转语音类QT_BEGIN_NAMESPACE namespace Ui { class Widget; } QT_END_NAMESPACEcl…

Redis——通用命令

目录 Redis通用命令Redis中最核心的两个命令getset Redis全局命令keys语法注意事项 existsdel(delete)expirettlredis的key的过期策略是怎么实现的&#xff1f;**了解拓展** type总结 Redis通用命令 Redis的命令非常非常多&#xff0c;所以 1. 掌握常用命令&#xff08;多操作…

ardunio超声波测距实验

工作原理 模块有2个超声波换能器&#xff08;如图所示&#xff09;&#xff0c;一个发出声波&#xff0c;另一个接收物体反射回来的声波&#xff0c;这中间所经过的时间即声波传播的时间&#xff0c;再结合声速就能计算出&#xff1a; 距离 声速 * 时间 2 如何使用HC-SR04模块…

从OracleCloudWorld和财报看Oracle的转变

2024年9月9-12日Oracle Cloud World在美国拉斯维加斯盛大开幕 押注AI和云 Oracle 创始人Larry Ellison做了对Oracle战略和未来愿景的主旨演讲&#xff0c;在演讲中Larry将AI技术和云战略推到了前所未有的高度&#xff0c;从新的Oracle 23c改名到Oracle23ai&#xff0c;到Oracl…

unity3d入门教程一

unity3d入门教程一 2.1-开发环境2.2 新建项目3.1编辑器页面3.2场景3.3添加资源4.1场景视图4.2游戏对象4.3坐标系4.4游戏对象的操作4.5摄像机 2.1-开发环境 https://unity.com/ https://unity.cn/ 安装时若卡住&#xff0c;打开路径自动安装 C:\Users\zhaocai\AppData\Local\T…

信息安全国内外现状及技术要求示例(R155/R156)

国际政策、 法规的现状与趋势 鉴于对交通安全、社会安全甚至国家安全的重要影响&#xff0c;汽车网络安全、数据安全得到各相关国家和地区的高度重视&#xff0c;纷纷出台相关法规、标准。 信息安全法规 R155 法规适用范围覆盖了乘用车及商用车&#xff0c;适用于 M 类、N 类…

北斗盒子:海上安全的智能守护者——落水报警应用案例

海上环境多变&#xff0c;无论是航行还是作业活动&#xff0c;安全始终是最重要的考量。近年来&#xff0c;我国大力发展海上经济&#xff0c;海上作业的增加也带来了溺水事故的频发&#xff0c;给家庭和社会带来沉重的伤痛。据世界卫生组织统计&#xff0c;溺水是世界各地非故…

SQL(结构性查询语句)

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、SQL是什么&#xff1f;二、DDL三、DML四、DQL五、DCL总结 提示&#xff1a;以下是本篇文章正文内容&#xff0c;下面案例可供参考 一、SQL是什么&#xff…

【R语言】删除数据框中所有行中没有大于200的数值的行

在Perl中还需要循环按行读入文件&#xff0c;而在R中&#xff0c;一行代码解决问题&#xff1a; df <- df[apply(df, 1, function(x) any(x > 200)), ]这是一个使用apply函数对数据框df进行操作的表达式。apply函数用于对数据框、矩阵或数组进行元素级别的操作。 df&am…

虚拟机安装教程

做一期详细的虚拟机安装教程 VM16.12版本下载地址&#xff1a;联想乐云 VM16版本许可证&#xff1a;ZF3R0-FHED2-M80TY-8QYGC-NPKYF 第一步双击打开安装包&#xff1a; 选择安装位置&#xff0c;选择空间充足的磁盘&#xff0c;一般不建议直接装c 取消勾选 等待安装 输入许可…

sqli-labs靶场自动化利用工具——第6关

文章目录 概要整体架构流程技术细节执行效果小结 概要 Sqli-Labs靶场对于网安专业的学生或正在学习网安的朋友来说并不陌生&#xff0c;或者说已经很熟悉。那有没有朋友想过自己开发一个测试脚本能实现自动化化测试sqli-labs呢&#xff1f;可能有些人会说不是有sqlmap&#…

中信银行信用卡中心社招:TAS人才测评系统题库及通关攻略更新了!

中信银行信用卡中心&#xff08;以下简称“卡中心”&#xff09;是中信银行在深圳设立的对信用卡业务进行统一管理、集中操作、独立核算的专营机构。2002年底&#xff0c;由中信银行总行与中信嘉华银行在深圳合作筹建成立&#xff1b;卡中心自成立伊始&#xff0c;始终坚持“以…

Windows系统一键启动Redis脚本

Redis 是一个开源的、高性能的键值存储数据库&#xff0c;广泛应用于缓存、数据分析、消息队列等场景。无论是在开发环境还是生产环境中&#xff0c;快速启动 Redis 服务都是非常重要的。为此&#xff0c;本文将介绍如何在 Windows 系统中创建一键启动 Redis 的脚本&#xff0c…

网络安全 L2 Introduction to Cryptography 密码学

Definitions 1. crypto - hidden/secret grafia - writing 2. “the science and study of secret writing” 3. Cryptography is the science of protecting data, which provides means of converting data into unreadable form, so that 1. the data cannot be ac…

make 程序规定的 makefile 文件的书写语法(2)

&#xff08;13&#xff09;接着开始一个更复杂的例子&#xff0c;课程的素材 2 &#xff0c;先给出书写 makefile 的框架 &#xff1a; &#xff08;14&#xff09; &#xff08;15&#xff09; 谢谢

0x07 Nginx越界读取缓存漏洞 CVE-2017-7529 复现

参考&#xff1a; Nginx越界读取缓存漏洞 CVE-2017-7529 | PeiQi文库 (wgpsec.org)Nginx越界读取缓存漏洞&#xff08;CVE-2017-7529&#xff09;复现分析 - qweg_focus - 博客园 (cnblogs.com) 一、fofa 搜索 nginx && port"80" 我这里写了个脚本将ip保存…