类和对象【上】

news/2024/11/29 10:37:08/

目录

面向过程和面向对象

C语言

C++

类的定义

类的两种定义方式

成员变量命名规则

类的访问限定符和封装

面试题

封装

类的作用域

类的实例化

类对象模型

 内存分配

内存对齐

this指针

特性

面试题

this指针存储在哪里?

this指针可以为空么?

结论:


面向过程和面向对象

C语言

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

C++

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

类的定义

在C语言中结构体只能定义变量,在C++中,结构体内不仅可以定义变量,也可以定义函数,在C++中,更喜欢用class来代替

类的两种定义方式

一种是是声明和定义全放在类里面

如果成员函数定义在类中,编译器会将其当作内联函数处理

另一种是类的声明放在.h文件这种,类的定义放在.c文件中(需要注意,成员函数名前需要加类名::)

.h文件

.c文件

成员变量命名规则

为了区分成员函数中的变量是成员变量还是成员函数,我们通常在成员函数前加上 _

类的访问限定符和封装

 c++实现封装的方式,用类将对象的属性与方法结合在一起,让对象更加完善,通过访问权限选择性的将其接口提供给外部的用户使用

说明:

public修饰的成员可以在类外面使用

protected和private修饰的成员不能在内外直接使用

访问权限作用域是从一个操作符开始开始到下一个操作符,如果没有到 } 结束

class默认权限为private,struct的默认权限是public

面试题

c++中class和struct的区别是什么?

C++需要兼容C语言,所以C++中struct可以当成结构体使用。另外C++中struct还可以用来

定义类。和class定义类是一样的,区别是struct定义的类默认访问权限是public,class定义的类

默认访问权限是private

封装

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

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

封装本质是一种管理,类比于电脑主机来说,厂家出厂时在外部套上壳子,将内部隐藏起来,仅提供开关机和接口等让用户与计算机进行交互

类的作用域

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

类的实例化

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

类是对对象进行描述的,并没有直接分配实际的内存空间

类实例化出来的对象占用实际的物理空间,存储类成员变量

类比于建造房子,类就相当于图纸,实例化出来的对象相当于房子

类对象模型

一个类中既可以存储成员变量,也可以存储成员函数

 内存分配

类中的成员函数放在公共代码区,不计入内存的计算

结论:一个类的大小实际是该类中的成员变量之和,注意内存对齐

空类的大小是一个字节

内存对齐

this指针

在d1,d2分别调用init函数时,为了区分不同对象,c++给每个非静态的成员变量都增加了一个隐藏指针参数,让该指针指向当前对象(函数运行时调用该函数的对象),在函数体中所有成员变量的操作都是通过该指针去访问用户不需要传递,编译器自己完成

特性

1.this指针的类型是 * const,在成员函数中不能给this赋值

2.this指针只能在函数内部使用

3.this指针本质是成员函数的形参,当对象调用成员函数时,将对象地址作为实参传递给this形参,所以对象中不存储this指针

4.this指针是成员函数第一个隐含的形参,一般由编译器通过ecx寄存器自动传递,不需要用户传递 

面试题

this指针存储在哪里?

编译器在获取到对象地址后保存在this指针,存放在寄存器ecx中,不同编译器存储位置不同

this指针可以为空么?

this指针可以为空,当我们调用的函数不需要调用对象中的变量时可以为空

1.this为空,没有调用对象中的变量,程序正常运行

2.this为空,调用对象中的变量,程序崩溃

结论:

C++中通过类可以将数据 以及 操作数据的方法进行完美结合,通过访问权限可以控制那些方法在
类外可以被调用,即封装,在使用时就像使用自己的成员一样,更符合人类对一件事物的认知。

http://www.ppmy.cn/news/1183581.html

相关文章

使用 kube-downscaler 降低Kubernetes集群成本

新钛云服已累计为您分享772篇技术干货 介绍 Kube-downscaler 是一款开源工具,允许用户定义 Kubernetes 中 pod 资源自动缩减的时间。这有助于通过减少非高峰时段的资源使用量来降低基础设施成本。 在本文中,我们将详细介绍 kube-downscaler 的功能、安装…

vue自定义全局指令v-emoji限制input输入表情和特殊字符

问题: 后台不提供富文本存储,所以emoji表情入库会报错需求要求前端在输入的时候过滤掉表情符号全局的input 和富文本textarea输入框都需要过滤emoji表情 分析: 1.每一个input写事件写正则校验代码量实在太多了还很麻烦;所以想用…

CentOS和Ubuntu命令行方式配置静态IP

CentOS和Ubuntu都是通过修改相关配置文件来配置静态IP,但是他们的配置文件有所不同 CentOS CentOS需要修改的配置文件:/etc/sysconfig/network-scripts/ifcfg-需要修改的网卡名字 [rootbloke ~]# cd /etc/sysconfig/network-scripts/ [rootbloke netw…

iOS开发-CoreNFC实现NFC标签Tag读取功能

iOS开发-CoreNFC实现NFC标签Tag读取功能 一、NFC近场通信 近场通信(NFC)是一种无线通信技术,它使设备能够在不使用互联网的情况下相互通信。它首先识别附近配备NFC的设备。NFC常用于智能手机和平板电脑。 二、实现NFC标签Tag读取功能 在…

IOC课程整理-12 Spring 国际化

1. Spring 国际化使用场景 2. Spring 国际化接口 3. 层次性 MessageSource 4. Java 国际化标准实现 5. Java 文本格式化 6. MessageSource 开箱即用实现 7. MessageSource 內建依赖 8. 课外资料 9. 面试题精选 Spring 国际化接口有哪些? • 核心接口 - MessageSour…

【错误解决方案】ModuleNotFoundError: No module named ‘cPickle‘

1. 错误提示 在python程序中试图导入一个名为cPickle的模块,但Python提示找不到这个模块。 错误提示:ModuleNotFoundError: No module named cPickle 2. 解决方案 实际上,cPickle是Python的pickle模块的一个C语言实现,通常用于…

Spring Authorization Server入门 (十九) 基于Redis的Token、客户端信息和授权确认信息存储

怎么使用Spring Data Redis实现Spring Authorization Server的核心services? 本文对应的是文档中的How-to: Implement core services with JPA,文档中使用Jpa实现了核心的三个服务类:授权信息、客户端信息和授权确认的服务;本文会…

数组的最长递减子序列

求一个数组的最长递减子序列 如{9,4,3,2,5,4,3,2}的最长递减子序列为{9,5,4,3,2} 思路:动态规划 构建与原数组同等容量的辅助数组dp,记…