当前位置: 首页 > news >正文

C++类与对象(上)【详析】

目录

    • 1.面向过程和面向对象初步认识
    • 2.类的引入
    • 3.类的定义
    • 4.类的访问限定符及封装
      • 4.1访问限定符
      • 4.2封装
    • 5.类的作用域
    • 6.类的实例化
    • 7.类对象模型
      • 7.1 如何计算类对象的大小
    • 8.this关键字

如果说我们对C++的初步认识,是觉得C++是对C语言不足之处的进行修补,在认识完类与对象后,我们会对C++产生新的认识

1.面向过程和面向对象初步认识

C语言是面向过程的,关注的是过程,分析出求解问题的步骤,通过函数调用逐步解决问题;

C++是基于面向对象的,关注的是对象,将一件事情拆分成不同的对象,靠对象之间的交互完成;

2.类的引入

C语言结构体中只能定义变量,在C++中,结构体内不仅可以定义变量,也可以定义函数。 比如: 之前在数据结构初阶中,用C语言方式实现的栈,结构体中只能定义变量;现在以C++方式实现, 会发现struct中也可以定义函数

对于C++中的struct:属性(成员变量)+方法(函数)

①兼容C中struct中的所有用法

②升级成了类

举例如下:

typedef int DataType;
//Stack为类名
struct Stack
{	//①属性DataType *_array;size_t _capacity;size_t _size;//②方法void Init(size_t capacity){//...}void Push(const DataType &data){//...}void Destroy(){//...}
};int main()
{	//s是对象Stack s;//【对象.方法】、【对象.属性】s.Init(10);s.Push(1);s.Push(2);s.Push(3);cout << s.Top() << endl;s.Destroy();return 0;
}

一般的,在定义成员变量名时,常常在前面加上前杠,例如:

class Date
{public:int _year;int _month;int _year;public:void Init(){//...}
}

3.类的定义

1.定义

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

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

类的两种定义方式:

①声明和定义全部放在类体中,需注意:成员函数如果在类中定义,编译器可能会将其当成内联函数处理

class People {
public:int age;int sex;int height;public:void Eat() {cout << "people can eat" << endl;}void Run() {cout << "people can run" << endl;}
};

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

为什么要声明和定义分离?

加强代码的可阅读性!

在cpp文件种对成员函数进行声明,注意标识,该函数的类域(即类名)

2.对象

和结构体一样,类的定义是一个类型,要访问它的成员(属性、方法)就要实例化对象

一个类可以定义多个对象

4.类的访问限定符及封装

4.1访问限定符

image-20221204115808982

① public修饰的成员在类外可以直接被访问

② protected和private修饰的成员在类外不能直接被访问(此处protected和private是类似的)

③访问权限作用域从该访问限定符出现的位置开始直到下一个访问限定符出现时为止

④如果后面没有访问限定符,作用域就到 } 即类结束

class的默认访问权限为private ,struct默认为public(因为struct要兼容C)

4.2封装

面向对象的三大特性: 封装、继承、多态

在类和对象阶段,主要是研究类的封装特性,那什么是封装呢?

封装:将数据和操作数据的方法进行有机结合,隐藏对象的属性和实现细节,仅对外公开接口来和对象进行交互

因此我们将属性置为private,通过public方法(公有成员)来实现对属性的操作

因此,封装的目的不是为了阻止对数据的访问,而是规定一种规范的方法,让我们对其访问

5.类的作用域

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

class Person
{
public:void PrintPersonInfo();
private:char _name[20];char _gender[3];int  _age;
};// 这里需要指定PrintPersonInfo是属于Person这个类域
void Person::PrintPersonInfo()
{cout << _name << " " << _gender << " " << _age << endl;
}

6.类的实例化

常见错误:

Person::_age=1;                   //wrong
Person::PrintPersonInfo();        //wrong

正确的:

//通过对象
Person p1;
p1._age=10;
p1.PrintPersonInfo();
//通过指针
Person p2;
Person* ptr=&p2;
ptr->_age=20;

7.类对象模型

7.1 如何计算类对象的大小

引入:

class A
{
public:void PrintA(){cout << _a << endl;}
private:char _a;
};

这里类A的大小是多少呢?

结果是1,我们发现类存储时只存了变量(属性)

而类对象的大小规则,同结构体内存对齐规则

【补充】:结构体内存对齐规则

1.第一个成员在与结构体偏移量为0的地址处

2.其他成员变量要对齐到某个数字(对齐数)的整数倍的地址处

注意:对齐数 = 编译器默认的一个对齐数与该成员大小的较小值,VS中默认的对齐数为8

3.结构体总大小为:最大对齐数(所有变量类型最大者与默认对齐参数取最小)的整数倍。

4.如果嵌套了结构体的情况,嵌套的结构体对齐到自己的最大对齐数的整数倍处,结构体的整体大小就是所有最大对齐数(含嵌套结构体的对齐数)的整数倍。

①例:内存对齐的体现

②例:空类大小为1——占位,不存储有效数据,标识对象存在

8.this关键字

1.引入:

class Date {
private:int _year;int _month;int _day;
public:void Init(int year, int month, int day) {_year = year;_month = month;_day = day;}
public:void Print() {cout << _year << " " << _month << " " << _day << endl;}
};

对于上述类,有这样的一个问题:

Date类中有 Init 与 Print 两个成员函数,函数体中没有关于不同对象的区分,那当d1调用 Init 函数时,该函数是如何知道应该设置d1对象,而不是设置d2对象呢?

C++中通过引入this指针解决该问题,即: C++编译器给每个“非静态的成员函数“增加了一个隐藏的指针参数,让该指针指向当前对象(函数运行时调用该函数的对象)

即:

void Print(Date* this) 
{cout << this->_year << " " << this->_month << " " << this->_day << endl;
}

注意:this指针的定义和传递是由编译器完成,我们不能去做,但是我们可以在类里面用this指针

这里的this代表d1和d2对象的地址:

image-20221213172915934

this指针与const修饰问题:

const Date* p1;      //修饰的是指针指向的对象       *p1
Date const* p2;      //修饰的是指针指向的对象       *p2
Date* const p3;      //修饰的是本身                p3

image-20230128135716151

2.this指针存在哪?

this是一个形参,一般存在栈帧中(vs下进行了优化,使用了ecx寄存器传递)

3.this指针可以为空吗?

// 1.下面程序编译运行结果是?   A、编译报错  B、运行崩溃  C、正常运行
class A
{
public:void Print(){cout << "Print()" << endl;}private:int _a;
};int main()
{A *p = nullptr;      //p这里是一个空指针p->Print();          //不发生解引用,因为成员函数的地址不在对象中,在公共代码区域return 0;
}
//正常运行
// 2.下面程序编译运行结果是?   A、编译报错  B、运行崩溃  C、正常运行
class A
{
public:void PrintA(){cout << _a << endl;    //本质是this->_a}private:int _a;
};int main()
{A *p = nullptr;            //发生空指针的解引用p->PrintA();return 0;
}
//运行崩溃

相关文章:

C++类与对象(上)【详析】

目录1.面向过程和面向对象初步认识2.类的引入3.类的定义4.类的访问限定符及封装4.1访问限定符4.2封装5.类的作用域6.类的实例化7.类对象模型7.1 如何计算类对象的大小8.this关键字如果说我们对C的初步认识&#xff0c;是觉得C是对C语言不足之处的进行修补&#xff0c;在认识完类…...

AIR系列|板载LED|gpio引脚选择|GPIO|流水灯|LuatOS-SOC接口|官方demo|学习(20-1):GPIO库基础

AIR系列各型号开发板板载LED对应管脚及GPIO控制代码 AIR103&#xff1a; rtos_bsp "AIR103" then -- Air103开发板LED引脚编号--return pin.PB26, pin.PB25, pin.PB24return 42,41,40 AIR105&#xff1a; rtos_bsp "AIR105" then -- Air105开发板LED引…...

MySQL数据库中的函数怎样使用?

函数 是指一段可以直接被另一段程序调用的程序或代码。 也就意味着&#xff0c;这一段程序或代码在MySQL中已经给我们提供了&#xff0c;我们要做的就是在合适的业务场景调用对应的函数完成对应的业务需求即可。 那么&#xff0c;函数到底在哪儿使用呢?我们先来看两个场景&…...

命名空间的使用大全

概述 在C中&#xff0c;我们会使用变量、常量、函数、类、对象、结构体等各种元素。随着工程越来越庞大&#xff0c;代表这些元素的标识符冲突的概率也越来越大。为了解决标识符命名冲突的问题&#xff0c;C标准在1995年引入了关键字namespace&#xff0c;也叫做命名空间。使用…...

Redisson分布式锁和同步器详解-官方原版

一、锁定基于Redis的Java分布式可重入锁对象&#xff0c;并实现了锁接口。如果获取锁的Redisson实例崩溃&#xff0c;则此类锁可能会在获取状态下永久挂起。为了避免这种Redisson维护锁看门狗&#xff0c;当锁持有者Redisson实例处于活动状态时&#xff0c;它会延长锁的到期时间…...

【C语言进阶】指针与数组、转移表详解

前言 大家好我是程序猿爱打拳&#xff0c;我们在学习完指针的基本概念后知道了指针就是地址&#xff0c;我们可以通过这个地址并对它进行解引用从而改变一些数据。但只学习指针的基础是完全不够的&#xff0c;因此学习完指针的基础后我们可以学习关于指针的进阶&#xff0c;其中…...

SDN是什么,和SD-WAN有什么关系

SDN全称为“软件定义网络”&#xff08;Software-Defined Networking&#xff09;&#xff0c;是一种新型的网络架构&#xff0c;通过将网络的控制面和数据面分离&#xff0c;将网络控制集中到控制器中进行统一管理和配置&#xff0c;以提高网络的灵活性和可管理性。传统网络的…...

百度前端高频react面试题(持续更新中)

说说你用react有什么坑点&#xff1f; 1. JSX做表达式判断时候&#xff0c;需要强转为boolean类型 如果不使用 !!b 进行强转数据类型&#xff0c;会在页面里面输出 0。 render() {const b 0;return <div>{!!b && <div>这是一段文本</div>}</div…...

中级嵌入式系统设计师2016下半年下午应用设计试题

中级嵌入式系统设计师2016下半年下午试题 试题一 阅读以下说明,回答问题1至问题3。 【说明】 某综合化智能空气净化器设计以微处理器为核心,包含各种传感器和控制器,具有检测环境空气参数(包含温湿度、可燃气体、细颗粒物等),空气净化、加湿、除湿、加热和杀菌等功能…...

【雅思备考】九分学长写作课笔记

原视频&#xff1a;https://www.bilibili.com/video/BV1FG4y1J7br?p13&vd_source552ac2291179cf9d44088ea168db5531 一、综述 共计1小时 小作文&#xff1a; 描述 图表图&#xff08;数据图&#xff09;、流程图&#xff08;示意图&#xff09;、地图&#xff08;示意…...

【源码解析】SpringBoot自动装配的实现原理

什么是SpringBoot的自动装配 SpringBoot在启动的时候会扫描外部jar包中的META-INF/spring.factories文件&#xff0c;将文件中配置的类信息按照条件装配到Spring容器中。 实现原理 核心注解SpringBootApplication Target({ElementType.TYPE}) Retention(RetentionPolicy.R…...

详解ROS时间戳

ROS&#xff08;Robot Operating System&#xff09;是一个用于机器人开发的开源软件框架&#xff0c;其中涉及到了一些与时间相关的概念和工具&#xff0c;如时间戳、计时器等。本文将主要介绍ROS中时间戳的概念和应用&#xff0c;并提供一个Python代码案例演示如何处理ROS时间…...

Android Window、WindowManager

1.窗口Window 在Android中显示一个界面,首先想到的是Activity、Dialog或Toast。但是在有些情况下,比如悬浮球,用Activity会显然多余,这个时候可以直接使用窗口来实现。 Android中所有的视图都是通过Window来呈现的,不管是Activity、Dialog还是Toast,它们的视图实际上都…...

【一天一门编程语言】怎样设计一门编程语言?

怎样设计一门编程语言&#xff1f; 确定目标 确定语言的用途&#xff1a; 是一门通用编程语言&#xff0c;还是一门专门面向某个特定目标的语言&#xff1f;是一门面向对象的语言&#xff0c;还是一门过程化的语言&#xff1f;将语言的最终用户定义为谁&#xff1f; 确定语言…...

微服务保护 -- 初识 Sentinel(雪崩问题,快速入门Sentinel)

大家好&#xff0c;今天我们要来学习阿里巴巴开源的流量控制和熔断降级框架 – Sentinel 。 1、雪崩问题及解决方案 首选我们来了解一下雪崩问题及其解决方案&#xff0c;我们学习这个微服务保护&#xff0c;其实就是为了去应对类似于雪崩问题这样的服务故障。 1.1 什么是雪…...

软件测试面试问答

笔试 笔试的话我们需要揣测具体会考什么内容&#xff0c;我们可以通过招聘信息去了解该公司需要什么样的技能&#xff0c;以此来准备笔试。一般必考的内容会有编程&#xff0c;测试用例设计&#xff0c;工作流程&#xff0c;逻辑思维等内容&#xff0c;除此之外每个公司可能还会…...

【架构】架构师的核心能力-抽象能力

文章目录一、通过归纳法找共性二、通过演绎法找关系三、通过归纳法找特性四、最后架构的核心是管理复杂度&#xff0c;架构师的核心能力是抽象能力&#xff0c;什么是抽象能力&#xff1f;抽象能力就是一种化繁为简的能力。何为化繁为简&#xff1f;就是把一种复杂的事情变得简…...

前端一面常见react面试题(持续更新中)

React 组件中怎么做事件代理&#xff1f;它的原理是什么&#xff1f; React基于Virtual DOM实现了一个SyntheticEvent层&#xff08;合成事件层&#xff09;&#xff0c;定义的事件处理器会接收到一个合成事件对象的实例&#xff0c;它符合W3C标准&#xff0c;且与原生的浏览器…...

亥姆霍兹线圈测量系统

亥姆霍兹线圈[Helmholtz线圈]是指由具有相同线圈匝数、相同线圈绕制方式且线圈半径等于线圈间距的一对或者多对线圈构成的线圈组合。 根据线圈的形状&#xff0c;亥姆霍兹线圈可分为圆形亥姆霍兹线圈和方形亥姆霍兹线圈&#xff1b;根据磁场方向&#xff0c;亥姆霍兹线圈可分为…...

JavaScript 类型转换

Number() 转换为数字&#xff0c; String() 转换为字符串&#xff0c; Boolean() 转化为布尔值。JavaScript 数据类型在 JavaScript 中有 5 种不同的数据类型&#xff1a;stringnumberbooleanobjectfunction3 种对象类型&#xff1a;ObjectDateArray2 个不包含任何值的数据类型…...

Spring Batch 综合案例实战-项目准备

目录 案例需求 分析 项目准备 步骤1&#xff1a;新开spring-batch-example 步骤2&#xff1a;导入依赖 步骤3&#xff1a;配置文件 步骤4&#xff1a;建立employee表与employe_temp表 步骤5&#xff1a;建立基本代码体系-domain-mapper-service-controller-mapper.xml …...

STM32CubeMX串口USART中断发送接收数据

本文代码使用 HAL 库。 文章目录前言一、中断控制二、USART中断使用1. 中断优先级设置 &#xff1a;2. 使能中断3. 使能UART的发送、接收中断4. 中断收发函数5. 中断处理函数6. 中断收发回调函数三、串口中断实验串口中断发送数据点亮 led&#xff1a;实验现象&#xff1a;总结…...

JavaScript Web Workers使用流程

背景 Web Workers是一个API&#xff0c;允许在浏览器中运行后台处理任务&#xff0c;而不影响用户界面&#xff08;UI&#xff09;线程的稳定性。 Web Workers 可用于消除阻止 UI 的耗时任务&#xff0c;如图表生成&#xff0c;物理模拟或数据分析等&#xff1a; 使用 Web W…...

数据结构与算法(五):优先队列

这节总结一下优先队列的常用实现方法。 一、基本概念 普通的队列是一种先进先出的数据结构&#xff0c;元素在队列尾追加&#xff0c;而从队列头删除。在优先队列中&#xff0c;元素被赋予优先级。当访问元素时&#xff0c;具有最高优先级的元素最先删除。优先队列具有最高级…...

二叉树的前序遍历-java两种方式-力扣144

一、题目描述给你二叉树的根节点 root &#xff0c;返回它节点值的 前序 遍历。示例 1&#xff1a;输入&#xff1a;root [1,null,2,3]输出&#xff1a;[1,2,3]示例 2&#xff1a;输入&#xff1a;root []输出&#xff1a;[]示例 3&#xff1a;输入&#xff1a;root [1]输出…...

浅析 Redis 主从同步与故障转移原理

我们在生产中使用 Redis&#xff0c;如果只部署一个 Redis 实例&#xff0c;当该实例宕机&#xff0c;到恢复之前都不可用&#xff1b;虽说 Redis 一般都用来做缓存&#xff0c;但不可用给业务系统带来的影响也是不小的&#xff0c;流量大时甚至会导致整个服务宕机。所以 Redis…...

MyBatis学习笔记(七) —— 特殊SQL的执行

7、特殊SQL的执行 7.1、模糊查询 模糊查询的三种方式&#xff1a; 方式1&#xff1a;select * from t_user where username like ‘%${mohu}%’ 方式2&#xff1a;select * from t_user where username like concat(‘%’,#{mohu},‘%’) 方式3&#xff1a;select * from t_u…...

计算机组成原理(1)--计算机系统概论

一、计算机系统简介1.计算机系统软硬件概念计算机系统由“硬件”和“软件”两大部分组成。所谓“硬件”&#xff0c;是指计算机的实体部分&#xff0c;它由看得见摸得着的各种电子元器件&#xff0c;各类光、电、机设备的实物组成&#xff0c;如主机、外部设备等。所谓“软件”…...

jdbc模板的基本使用

1.JdbcTemplate的开发步骤 <1>导入spring-jdbc和spring-tx坐标 <2>创建数据库表和实体 <3>创建JdbcTemplate对象 <4>执行数据库 2.JdbcTemplate快速入门 <1>导入坐标 <dependency><groupId>org.springframework</groupId><…...

JPA 注解及主键生成策略使用指南

JPA 注解 Entity 常用注解 参考&#xff1a;JPA & Spring Data JPA学习与使用小记 指定对象与数据库字段映射时注解的位置&#xff1a;如Id、Column等注解指定Entity的字段与数据库字段对应关系时&#xff0c;注解的位置可以在Field&#xff08;属性&#xff09;或Prope…...

网站备案的幕布是什么意思/企业网络搭建

//main.c //include基本概念//include是预处理指令&#xff0c;翻译之前会替换&#xff0c;编译之前左的处理&#xff0c;#都是预处理指令&#xff0c;翻译时候会添加别的内容进来。#include <stdio.h> // #是预编译指令&#xff0c;告诉系统printf函数是存在的, 告诉系统…...

wordpress属于区域连技术吗/上海网站seo外包

漏洞描述 GoCD plugin aip 参数中的 pluginName 参数存在任意文件读取漏洞&#xff0c;导致攻击者可以获取服务器中的任意敏感信息 fofa语法 title“Create a pipeline - Go” POC /go/add-on/business-continuity/api/plugin?folderName&pluginName../../../etc/pas…...

上海建设单位工程备案网站/hao123网址导航

从Theano到Lasagne&#xff1a;基于Python的深度学习的框架和库 摘要&#xff1a;最近&#xff0c;深度神经网络以“Deep Dreams”形式在网站中如雨后春笋般出现&#xff0c;或是像谷歌研究原创论文中描述的那样&#xff1a;Inceptionism。在这篇文章中&#xff0c;我们将讨论几…...

改善网站建设/最新seo课程

介绍(2021-05-12)用*好的iOS鼾声分析软件来记录、测量和减少您的鼾声。医生强烈推荐&#xff01;鼾声分析器利用声波分析来测量和记录鼾声&#xff0c;帮助您找出减少鼾声的有效方法。“这个应用是个意外的惊喜。我第一次感觉能够控制打鼾了。谢谢鼾声分析器&#xff01;”“鼾…...

注册公司最低需要多少钱/搜索引擎优化规则

批量的的数据导入数据库中&#xff0c;尽量少的访问数据库&#xff0c;高性能的对数据库进行存储。 采用SqlBulkCopy来处理存储数据。SqlBulkCopy存储大批量的数据非常的高效&#xff0c;将内存中的数据表直接的一次性的存储到数据库中&#xff0c;而不需要一次一次的向数据库I…...

1如何做网站推广/html静态网页制作

10月10日&#xff0c;复旦大学Google Camp正式成立&#xff0c;李开复教授在成立仪式上发表了《21世纪所需要的7种人才》演讲&#xff0c;并回答了复旦同学7个“犀利”的问题&#xff0c;我们将在近期依次整理出这7个问答。一.开复如何评价谷歌的竞争对手——百度。复旦同学&am…...