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

类和对象(上篇)

类和对象

  • 面向过程和面向对象的区别:
  • 结构体变为类
  • 类的一些性质
    • 类的访问限定符
    • 类的实体化
    • 类对象的大小
    • this指针

面向过程和面向对象的区别:

C语言是面向过程的,关注的是过程,分析出求解问题的步骤,通过函数调用逐步解决问题。
在这里插入图片描述
C++是基于面向对象的,关注的是对象,将一件事情拆分成不同的对象,靠对象之间的交互完
成。
在这里插入图片描述

结构体变为类

C语言结构体中只能定义变量,在C++中,结构体内不仅可以定义变量,也可以定义函数。

比如用C语言的结构体写一个栈,成员变量和函数是分离的

struct Stack
{int* a;int capacity;int size;
};void Init(struct Stack* p);
void push(struct Stack* p);

而C++来定义栈的时候,结构体里面也可以定义函数,且在不对结构体重命名的情况下,在定义结构体变量的时候也可以省了前面的struct

typedef int DataType;
struct Stack
{
//函数可以写在结构体的里面void Init(size_t capacity)//接收的时候也不需要定义一个指针接收结构体变量的的地址,因为有一个默认指针thiS来接收{_array = (DataType*)malloc(sizeof(DataType) * capacity);if (nullptr == _array){perror("malloc申请空间失败");return;}_capacity = capacity;_size = 0;}void Push(const DataType& data){// 扩容_array[_size] = data;++_size;}DataType Top(){return _array[_size - 1];}void Destroy(){if (_array){free(_array);_array = nullptr;_capacity = 0;_size = 0;}}DataType* _array;size_t _capacity;size_t _size;
};
int main()
{Stack s;//可以省去前面的structs.Init(10);//且调用函数的时候不在是传结构体变量的指针,而是用结构体变量点函数;s.Push(1);s.Push(2);s.Push(3);cout << s.Top() << endl;s.Destroy();return 0;}

此外它也可以申明和定义分离,但是要注意的是,他的作用域,定义的函数要用 结构体名::函数
来实现才能找到这个结构体里申明的函数
当然在声明和定义分离的情况下,.h文件中也可以出现函数的定义。
在这里插入图片描述
到了这里我们就可以把结构体变成类了

类的一些性质

在这里插入图片描述

所以在C++中我们定义成员变量的时候一般在前面加一个—

class Date
{
public:void Init(int year){_year = year;}
private:int _year;
};

类的访问限定符

public:公有
private:私有
protected:保护
当前阶段我们认为私有private和保护protected没有区别

  1. public修饰的成员在类外可以直接被访问
  2. protected和private修饰的成员在类外不能直接被访问(此处protected和private是类似的)

访问权限作用域从该访问限定符出现的位置开始直到下一个访问限定符出现时为止
3. 如果后面没有访问限定符,作用域就到 } 即类结束
class的默认访问权限为private,struct为public(因为struct要兼容C)——这也是struct和class的一个重要区别
在这里插入图片描述

注意:访问限定符只在编译时有用,当数据映射到内存后,没有任何访问限定符上的区别

类的实体化

类是对对象进行描述的,是一个模型一样的东西,限定了类有哪些成员,定义出一个类并没
有分配实际的内存空间来存储它;
在这里插入图片描述
只有把类实例化为一个个对象,然后通过这个对象才能访问类中的值
类和对象是一对多的(设计图和房子)

类对象的大小

在这里插入图片描述
一个类的大小,实际就是该类中”成员变量”之和,当然要注意内存对齐

注意空类(无成员变量)的大小,空类比较特殊,编译器给了空类一个字节来唯一标识这个类的对象(表示他存在过)
在这里插入图片描述

this指针

在这里插入图片描述
C++里影藏的形参指针this
实际上是这样的,只不过C++编译器帮我们做了,所以我们不可以写出来
在这里插入图片描述
不过这里是可以写出来的
在这里插入图片描述
所以在调用类的的成员函数的时候,是不需要把对象的&地址写在实参里的,只需要对象名.函数,所以,函数的形参是影藏了一个this指针的。

因为对象的大小只有成员变量的大小,所以this指针的大小是不可能存在对象里面的。是存在栈帧上面的。

相关文章:

  • mysql面试题——日志与MVCC
  • 数据链路层之VLAN基本概念和基本原理
  • Excel导入组件的封装以及使用页面点击弹出该弹框
  • 营销互动类小游戏策划与开发
  • 【Ratis】Grpc.proto文件里定义的一些RPC
  • Mysq8l在Centos上安装后忘记root密码如何重新设置
  • windows系统mobaxterm远程执行linux上ssh命令
  • Sublime text 添加到鼠标右键菜单,脚本实现
  • 【大模型】更强的 ChatGLM3-6B 来了,开源可商用
  • 虚假IP地址攻击的溯源方法
  • MDK5改造之格式化以及文件函数注释插件和主题应用
  • C/C++内存管理(含C++中new和delete的使用)
  • SpringCloud 微服务全栈体系(十八)
  • 第8关:定义一个名为PROC_AVGWEIGHT的有参数存储过程
  • MIT线性代数笔记-第21讲-特征值,特征向量
  • [译]前端离线指南(上)
  • 【跃迁之路】【669天】程序员高效学习方法论探索系列(实验阶段426-2018.12.13)...
  • 77. Combinations
  • angular组件开发
  • AzureCon上微软宣布了哪些容器相关的重磅消息
  • Brief introduction of how to 'Call, Apply and Bind'
  • Docker: 容器互访的三种方式
  • EventListener原理
  • Flannel解读
  • IE报vuex requires a Promise polyfill in this browser问题解决
  • Magento 1.x 中文订单打印乱码
  • NSTimer学习笔记
  • PHP 小技巧
  • Spring Cloud中负载均衡器概览
  • vue 配置sass、scss全局变量
  • Vue 重置组件到初始状态
  • 基于axios的vue插件,让http请求更简单
  • 力扣(LeetCode)357
  • 力扣(LeetCode)56
  • 如何借助 NoSQL 提高 JPA 应用性能
  • 事件委托的小应用
  • 我的zsh配置, 2019最新方案
  • 协程
  • 以太坊客户端Geth命令参数详解
  • 智能合约开发环境搭建及Hello World合约
  • 白色的风信子
  • 移动端高清、多屏适配方案
  • 曾刷新两项世界纪录,腾讯优图人脸检测算法 DSFD 正式开源 ...
  • ​ArcGIS Pro 如何批量删除字段
  • ​一文看懂数据清洗:缺失值、异常值和重复值的处理
  • (C++17) std算法之执行策略 execution
  • (MonoGame从入门到放弃-1) MonoGame环境搭建
  • (poj1.3.2)1791(构造法模拟)
  • (pytorch进阶之路)扩散概率模型
  • (ros//EnvironmentVariables)ros环境变量
  • (阿里云万网)-域名注册购买实名流程
  • (力扣记录)235. 二叉搜索树的最近公共祖先
  • (续)使用Django搭建一个完整的项目(Centos7+Nginx)
  • (译)计算距离、方位和更多经纬度之间的点
  • .NET 8.0 发布到 IIS