类与对象(上)

类与对象(上)

  • 一、面向过程和面向对象的区别
  • 二、类
    • 1、类的引入
    • 2、类的定义
      • (1)类的基本定义
      • (2)类的成员函数的定义方法
    • 3、类的访问限定符
    • 4、封装
    • 5、驼峰法命名规则
    • 6、类的作用域
    • 7、类的实例化
      • (1)实例化的概念与作用
      • (2)类没有实例化对象
      • (3)类有实例化对象
    • 8、生命周期与作用域的关系
  • 三、类对象模型
    • 1、类对象的存储方式(只保存成员变量,成员函数存放在公共的代码区中)
    • 2、C语言结构体内存对齐规则
    • 3、计算类对象的大小
  • 四、this指针
    • 1、示例代码
    • 2、this指针的作用
    • 3、成员函数的实际参数与错误
    • 4、this指针的特性

一、面向过程和面向对象的区别

在学习C++之前,我们已经学了C语言,而C语言是面向过程的计算机语言,关注的是过程,即要求编程者分析出求解问题的步骤,进而通过函数调用的方式逐步解决问题;而C++是基于面向对象的计算机语言,关注的是对象,即将一件事情拆分成不同的对象,靠对象之间的交互完成要求。但是,因为C++是在C语言的基础之上创建出来的计算机语言,所以C++是兼容C语言的,即C++不是纯面向对象的语言,它可以面向对象和面向过程混编。

二、类

1、类的引入

在C语言中,有结构体struct的概念,在C++中,因为它兼容C语言的缘故,所以struct在C++中可以是结构体,但确切的说它升级成为了类,而类与结构体最明显的两个区别就是能在类里面定义函数和有访问权限的概念。比如用C语言实现栈(参见栈与队列),里面的结构体中只能有成员变量而不能有成员函数,所以,实现栈的一系列函数只能在结构体外去实现。但是,在C++中使用类时更喜欢用class而不是struct,虽然两者在C++中都是类,但class的默认访问权限为private,而struct的默认访问权限为public。

2、类的定义

(1)类的基本定义

class className
{//类体:由成员函数和成员变量组成
};  //记得加上分号
  • class为定义类的关键字,ClassName为要定义的类的名字,{}中的内容为类的主体,在类定义结束时,}后面的分号不能省略。
  • 类体中的内容称为类的成员:类中的变量称为类的属性或成员变量;类中的函数称为类的方法或者成员函数。

(2)类的成员函数的定义方法

  • 声明和定义全部放在类体中,编译器可能会将其当成内联函数处理。
class Person
{
public:void ShowInfo(){cout << _name << " " << _sex << " " << _age << endl;}
private:char* _name;char* _sex;int _age;
};
  • 类的成员函数的声明放在.h文件中,成员函数的定义放在.cpp文件中,此时在成员函数的定义中,成员函数名前需要加类名::。
    在这里插入图片描述
  • 如果类的成员函数比较小,能够成为inline函数,则可以直接在类里面定义,而如果是大函数、递归的成员函数,则应该用声明和定义分离的方法定义成员函数。这样代码比较简洁,可读性比较高,阅读用这种方法所写的代码时能够比较容易地了解类的作用。
  • 什么样的函数适合inline函数参见万字讲解C++基础

3、类的访问限定符

在这里插入图片描述

  • public修饰的成员在类外可以直接被访问。
  • protected和private修饰的成员在类外不能直接被访问,即只能在类里面访问,而在此处protected和private的作用是相似的。
  • 访问限定符的访问权限作用域从该访问限定符出现的位置开始,到下一个访问限定符出现时结束或者后面没有访问限定符了,则到 }结束。
  • 访问限定符只在编译时有用,当数据映射到内存后,被访问限定符修饰的所有成员没有任何区别。

4、封装

将数据和操作数据的方法(类的成员函数)进行有机结合,隐藏对象的属性和实现细节,仅对外公开接口和对象进行交互。

5、驼峰法命名规则

  • 函数名、类名等所有单词首字母大写,如SnowDragon
  • 变量首字母小写,后面单词首字母大写,如snowDragon
  • 成员变量,首单词前面加_,如_snowDragon

6、类的作用域

类似于函数、循环等等,它们都具有作用域,类也具有作用域,即类的{}所括起来的区域。类的所有成员都被包含在这个作用域中。当在类的类体外定义成员时,需要使用::作用域操作符指明定义的成员属于哪个类域。

7、类的实例化

(1)实例化的概念与作用

  • 用类类型创建对象的过程,称为类的实例化。
  • 类是对对象进行描述的,即它是一个像模型一样的东西,限定了类具有的成员,定义完成一个类时,编译器并没有分配实际的内存空间出来,即此时的类不能存储数据。
  • 一个类可以实例化出多个对象,而实例化出的对象是具有实际的物理空间的,即它们能够存储类的成员变量的数据。

(2)类没有实例化对象

在这里插入图片描述

(3)类有实例化对象

在这里插入图片描述

  • 因为类是定义在全局作用域中的,而main函数是在类外,所以此处要在main函数中调用类的成员变量时,得将类中类的成员变量用public访问限定符修饰,否则无法进行访问。
  • 对_name和_sex成员变量赋值时,由于上图的代码在main函数中是用常量字符串对其进行赋值,所以_name和_sex需用const进行修饰。
    在这里插入图片描述

8、生命周期与作用域的关系

  • 作用域影响变量的访问,但不影响变量的生命周期。
  • 生命周期与变量存储的位置有关,当变量所在的空间是在栈上的,当变量所在的作用域结束时,该作用域在栈上的空间将被操作系统回收,而变量也在这块被回收的空间中,即它的生命周期也结束了。

三、类对象模型

1、类对象的存储方式(只保存成员变量,成员函数存放在公共的代码区中)

在这里插入图片描述

  • 如果要调用类的成员函数,编译器会在编译链接时根据函数名去公共代码区找到被调用的函数的地址,用反汇编的方式查看时,会有call该函数的地址的代码。

2、C语言结构体内存对齐规则

  • 第一个成员从在与结构体偏移量为0的地址处开始存储。
  • 对齐数为在编译器默认的对齐数与该成员类型的大小中的较小值(VS编译器中的默认对齐数为8)。
  • 其他成员变量要对齐到对齐数的整数倍的地址处才可以开始存储。
  • 结构体总大小为:最大对齐数(所有变量对齐数的最大值与默认对齐数,两者中最小的那个)的整数倍。
  • 如果嵌套了结构体,嵌套的结构体对齐到自己的最大对齐数的整数倍处,而结构体的整体大小就是所有最大对齐数(含嵌套结构体的对齐数)的整数倍。

3、计算类对象的大小

  • 一个类的大小就是该类中所有成员变量的大小之和,计算大小总和的方法要注意内存对齐规则。
  • 如果类为空类,编译器会给该类一个字节来唯一标识这个类的对象。

四、this指针

1、示例代码

class Date
{
public:void Init(int year, int month, int day){//this = nullptr;_year = year;_month = month;_day = day;}void Print(){cout << _year << " " << _month << " " << _day << endl;}
private:int _year;int _month;int _day;
};int main()
{Date d1;d1.Init(2023, 8, 15);d1.Print();Date d2;d2.Init(2023, 8, 16);d2.Print();return 0;
}

2、this指针的作用

  • 在上方的示例代码Date类中,有Init与Print两个成员函数,但在两个函数的函数体中没有关于不同对象的区分,那当d1调用Init函数时,该函数是通过this指针进行访问并设置对象。
  • 即C++编译器给每个”非静态的成员函数“增加了一个隐藏的指针作为函数的形式参数,让该指针指向当前对象(函数运行时调用该函数的对象),在函数体中对所有“成员变量”的操作都是通过这个指针去访问的。只不过所有的操作对用户都是透明的,即用户不需要自己传递当前对象的地址作为参数,编译器会自动完成这些操作。

3、成员函数的实际参数与错误

在这里插入图片描述

4、this指针的特性

  • this指针的类型:类类型* const,因为this被const修饰了,所以在成员函数中,不能给this指针赋值(上方代码中注释掉的那行代码)且只能在“成员函数”的内部使用。
  • this指针本质上是“成员函数”的形参,当对象调用成员函数时,编译器会将对象的地址作为实参传递给this形参,因为this是形参,所以它存在栈上。
  • this指针是类的成员函数的形式参数中第一个隐含的指针形参,在VS编译器下,传给this的实参是通过ecx寄存器自动传递的,不需要用户自己填写该实参。而用寄存器传递会提高this访问变量的效率,是否对this指针进行优化是由编译器决定的。
  • 只要类的成员函数内部不需要this进行访问,则该成员函数的this指针可以为空,即调用这个成员函数的对象可以为nullptr。
  • 实参和形参位置不能显示传递和接收this指针,但是可以在成员函数内部使用this指针。

本文到这里就结束了,如有错误或者不清楚的地方欢迎评论或者私信
创作不易,如果觉得博主写得不错,请务必点赞、收藏加关注💕💕💕

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

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

相关文章

金蝶软件实现导入Excel数据分录行信息到单据体分录行中

>>>适合KIS云专业版V16.0|KIS云旗舰版V7.0|K/3 WISE 14.0等版本<<< 金蝶软件中实现[导入Excel数据业务分录行]信息到[金蝶单据体分录]中,在采购订单|采购入库单|销售订单|销售出库单等类型单据中,以少量的必要字段在excel表格中按模板填列好,很方便快捷地从…

IntelliJ IDEA(简称Idea) 基本常用设置及Maven部署---详细介绍

一&#xff0c;Idea是什么&#xff1f; 前言&#xff1a; 众所周知&#xff0c;现在有许多编译工具&#xff0c;如eclipse&#xff0c;pathon, 今天所要学的Idea编译工具 Idea是JetBrains公司开发的一款强大的集成开发环境&#xff08;IDE&#xff09;&#xff0c;主要用于Java…

Rancher管理K8S

1 介绍 Rancher是一个开源的企业级多集群Kubernetes管理平台&#xff0c;实现了Kubernetes集群在混合云本地数据中心的集中部署与管理&#xff0c;以确保集群的安全性&#xff0c;加速企业数字化转型。Rancher 1.0版本在2016年就已发布&#xff0c;时至今日&#xff0c;Ranche…

CS:GO升级 Linux不再是“法外之地”

在前天的VAC大规模封禁中&#xff0c;有不少Linux平台的作弊玩家也迎来了“迟到”的VAC封禁。   一直以来&#xff0c;Linux就是VAC封禁的法外之地。虽然大部分玩家都使用Windows平台进行游戏。但实际上&#xff0c;使用Linux畅玩CS:GO的玩家也不在少数。 以前V社主要打击W…

06-微信小程序-注册程序-场景值

06-微信小程序-注册程序 文章目录 注册小程序参数 Object object案例代码 场景值场景值作用场景值列表案例代码 注册小程序 每个小程序都需要在 app.js 中调用 App 方法注册小程序实例&#xff0c;绑定生命周期回调函数、错误监听和页面不存在监听函数等。 详细的参数含义和使…

【LeetCode】543.二叉树的直径

题目 给你一棵二叉树的根节点&#xff0c;返回该树的 直径 。 二叉树的 直径 是指树中任意两个节点之间最长路径的 长度 。这条路径可能经过也可能不经过根节点 root 。 两节点之间路径的 长度 由它们之间边数表示。 示例 1&#xff1a; 输入&#xff1a;root [1,2,3,4,5]…

高并发内存池(centralcache)[2]

Central cache threadcache是每个线程独享&#xff0c;而centralcache是多线程共享&#xff0c;需要加锁&#xff08;桶锁&#xff09;一个桶一个锁 解决外碎片问题&#xff1a;内碎片&#xff1a;申请大小超过实际大小&#xff1b;外碎片&#xff1a;空间碎片不连续&#x…

跨境电商ERP源码大揭秘,让你少走弯路

本文将深入介绍跨境电商ERP源码的重要性以及如何选择和应用它们&#xff0c;让你的电商业务更高效、顺畅。 跨境电商ERP源码的重要性 提升管理效率 跨境电商运营面临着众多挑战&#xff0c;如订单管理、库存追踪和财务报告等。跨境电商ERP源码能够集成这些功能&#xff0c;帮…

自动驾驶,一次道阻且长的远征|数据猿直播干货分享

‍数据智能产业创新服务媒体 ——聚焦数智 改变商业 在6月的世界人工智能大会上&#xff0c;马斯克在致辞中宣称&#xff0c;到2023年底&#xff0c;特斯拉便可实现L4级或L5级的完全自动驾驶&#xff08;FSD&#xff09;。两个月之后&#xff0c;马斯克又在X社交平台上发言&am…

java面试强基(16)

目录 clone方法的保护机制 Java中由SubString方法是否会引起内存泄漏&#xff1f; Java中提供了哪两种用于多态的机制? 程序计数器(线程私有) 如何判断对象是否是垃圾&#xff1f; clone方法的保护机制 clone0方法的保护机制在Object中是被声明为 protected的。以User…

1000元到3000元预算的阿里云服务器配置大全

1000元、2000元或3000元预算能够买的阿里云服务器配置有哪些&#xff1f;可以选择ECS通用算力型u1云服务器、ECS计算型c7或通用型g7实例规格&#xff0c;当然&#xff0c;如果选择轻量应用服务器的话&#xff0c;更省钱&#xff0c;阿里云百科分享1000-3000元预算能买的阿里云服…

三、Dubbo 注册中心

三、Dubbo 注册中心 3.1 注册中心概述 主要作用 动态加入&#xff1a;服务提供者通过注册中心动态地把自己暴露给其他消费者动态发现&#xff1a;消费者动态地感知新的配置、路由规则和新的服务提供者动态调整&#xff1a;注册中心支持参数的动态调整&#xff0c;新参数自动更…

如何用轻叶H5制作一份调查问卷

在营销落地页中&#xff0c;问卷类H5是一种制作简单&#xff0c;易于传播的落地页&#xff0c;通过精巧的设计和严密的逻辑设置&#xff0c;问卷类H5的投放效果也是不容小觑的。 问卷类H5在制作中有以下不可缺少的要素&#xff1a; 清晰的标题和简要的说明 标题应该简明扼要地…

用pytorch实现AlexNet

AlexNet经典网络由Alex Krizhevsky、Hinton等人在2012年提出&#xff0c;发表在NIPS&#xff0c;论文名为《ImageNet Classification with Deep Convolutional Neural Networks》&#xff0c;论文见&#xff1a;http://www.cs.toronto.edu/~hinton/absps/imagenet.pdf &#xf…

【观察者设计模式详解】C/Java/JS/Go/Python/TS不同语言实现

简介 观察者模式&#xff08;Observer Pattern&#xff09;是一种行为型模式。它定义对象间的一种一对多的依赖关系&#xff0c;当一个对象的状态发生改变时&#xff0c;所有依赖于它的对象都得到通知并被自动更新。 观察者模式使用三个类Subject、Observer和Client。Subject…

策略梯度方法

策略梯度方法 数学背景 给定一个标量函数 J ( θ ) J\left(\theta\right) J(θ)&#xff0c;利用梯度上升法&#xff0c;使其最大化&#xff0c;此时的 π θ \pi_\theta πθ​就是最优策略。 θ t 1 θ t α ∇ θ J ( θ t ) \theta_{t1}\theta_t\alpha \nabla_\theta…

Element Plus el-table 数据为空时自定义内容【默认为 No Data】

1. 通过 Table 属性设置 <div class"el-plus-table"><el-table empty-text"暂无数据" :data"tableData" style"width: 100%"><el-table-column prop"date" label"Date" width"180" /&g…

移动通信系统的LMS自适应波束成形技术matlab仿真

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 5.算法完整程序工程 1.算法运行效果图预览 2.算法运行软件版本 matlab2022a 3.部分核心程序 ..................................................................... idxx0; while idxx&…

Spring Bean的生命周期总结(包含面试题)

目录 一、Bean的初始化过程 1. 加载Spring Bean 2. 解析Bean的定义 3. Bean属性定义 4. BeanFactoryPostProcessor 扩展接口 5. 实例化Bean对象 6. Aware感知 7. 初始化方法 8. 后置处理 9. destroy 销毁 二、Bean的单例与多例模式 2.1 单例模式&#xff08;Sin…