类和对象-1

news2024/11/16 4:36:49

文章目录

  • 面向过程和面向对象的概念
  • 类的引入
  • 访问限定符
  • 类的大小
  • this指针

面向过程和面向对象的概念

面向过程是一种按照步骤顺序执行的编程方式,而面向对象则是以对象为中心,将数据和操作封装在一起。在面向对象编程中,可以通过定义类和对象来实现数据的抽象和封装,提高代码的可重用性和可维护性。

C语言就是一种面向过程的语言,因而在解决一些较大项目时会显得较为繁琐。
C++则是一款面向对象的语言,因为引入了的概念。

类的引入

C语言结构体中只能定义变量,在C++中,结构体内不仅可以定义变量,也可以定义函数
此外,声明结构体的时候可以省略struct。

typedef int DataType;
struct Stack
{
	DataType* _array;
	size_t _capacity;
	size_t _size;
	void Push(const DataType& data)
	{
		_array[_size] = data;
		_size++;
	}
	void Top()
	{
		//...
	}
};
int main()
{
	struct Stack s1;
	Stack s2;
	s2.Push(1);
}

当然对于上述代码,c++中更喜欢将struct换成关键字class

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

class为定义类的关键字,ClassName为类的名字,{}中为类的主体,注意类定义结束时后面分号不能省略。
类体中内容称为类的成员:类中的变量称为类的属性或成员变量; 类中的函数称为类的方法或者成员函数
类里面的函数也可以像普通函数一样声明和定义分离,不过定义函数时需要加上作用域限定符:

typedef int DataType;
class Stack
{
	DataType* _array;
	size_t _capacity;
	size_t _size;
	void Push(const DataType& data);
	void Top();
};
void Stack::Push(const DataType& data)
{
	{
		_array[_size] = data;
		_size++;
	}
}

访问限定符

  1. public修饰的成员在类外可以直接被访问
  2. protected和private修饰的成员在类外不能直接被访问(此处protected和private是类似的)
  3. 访问权限作用域从该访问限定符出现的位置开始直到下一个访问限定符出现时为止
  4. 如果后面没有访问限定符,作用域就到“}”即类结束。
  5. class的默认访问权限为private,struct为public(因为struct要兼容C)
  6. 访问限定符只在编译时有用,当数据映射到内存后,没有任何访问限定符上的区别

C++通过类和访问限定符的有机结合实现了封装:用类将对象的属性与方法结合在一块,让对象更加完善,通过访问权限选择性的将其接口提供给外部的用户使用。

类的大小

  • 计算类的大小和计算结构体大小的方式一致,忽略成员函数的大小
  • 因为同一个类里面的同一成员函数的地址都是一样的,因此类的成员函数并不存储在类里面。
  • 空的类或者只有类的方法而没有类的属性,其用sizeof运算的结果为1

this指针

C++编译器给每个“非静态的成员函数“增加了一个隐藏的指针参数,让该指针指向当前对象(函数运行时调用该函数的对象),在函数体中所有“成员变量”的操作,都是通过该指针去访问。只不过所有的操作对用户是透明的,即用户不需要来传递,编译器自动完成。

typedef int DataType;
struct Stack
{
private:
	DataType* _array;
	size_t _capacity;
	size_t _size;
public:
	void Init(size_t capacity = 4)
	{
		_array = (DataType*)malloc(sizeof(DataType) * capacity);
		_capacity = capacity;
		_size = 0;
	}
	void Push(const DataType& data)
	{
		_array[_size] = data;
		_size++;
	}
	void Top()
	{
		//...
	}
	void Print()
	{
		cout << this << endl;
	}
};
int main()
{
	Stack s1;
	s1.Print();
	cout << &s1 << endl;
	Stack* ps1 = nullptr;
	ps1->Print();
	cout << ps1 << endl;
	(*ps1).Print();
	return 0;
}

在这里插入图片描述
观察上述代码的运行结果,我们可以得出以下事实:

  1. 在调用类的成员函数时,编译器会传一个隐藏的this指针,这个指针不用也不能用户自己实现,但是我们可以调用这个指针。
  2. 类的成员函数的确不是存储在类中的。(因为我们使用的ps1是空指针却依然调用了成员函数)
  3. 关于解引用操作只是给计算机的一个建议,至于是否真的需要解引用则由计算机判断。因为我们解引用空指针来调用成员函数却没有报错。

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

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

相关文章

MySQL--为什么加了唯一索引还会产生重复数据

场景&#xff1a; 我在一张表里设置了唯一索引&#xff0c;但是我发现还是出现了重复数据&#xff0c;这是什么情况呢&#xff0c;难道唯一索引失效了&#xff1f; 准备数据&#xff1a; -- dc_portal.user definitionCREATE TABLE user (id bigint unsigned NOT NULL AUTO_…

XPath语法、轴、运算符-满满干货拿走不谢

&#x1f341;博主简介&#xff1a; &#x1f3c5;云计算领域优质创作者 &#x1f3c5;2022年CSDN新星计划python赛道第一名 &#x1f3c5;2022年CSDN原力计划优质作者 &#x1f3c5;阿里云ACE认证高级工程师 &#x1f3c5;阿里云开发者社区专…

‘wget’与‘bat 批处理’ 相结合的批量下载操作

前言 wget命令是一个在Linux和类Unix操作系统中经常使用的网络命令&#xff0c;用途是从指定的URL下载文件。它支持HTTP、HTTPS和FTP协议&#xff0c;支持断点续传&#xff0c;可以下载整个网站&#xff0c;当然windows环境下也可以使用&#xff0c;参考地址&#xff1a;GNU W…

几个不错的 Jupyter Notebook 云端展示平台

jupyter nbviewer URL:https://nbviewer.jupyter.org/ 结合Github的示例用法&#xff1a;https://nbviewer.jupyter.org/github/ <用户名或者用户名/存放ipynb文件的仓库或者Gist ID> 例如&#xff1a;https://nbviewer.jupyter.org/github/yeshan333/JupyterNotebook…

Springboot和Spring Cloud版本对应

Spring在不断地升级&#xff0c;各个版本存在一些不兼容的地方&#xff0c;为了避免出现问题&#xff0c;最好注意使用正确的版本。 官网的对应关系&#xff1a;https://start.spring.io/actuator/info 如下图&#xff1a; 下面附一下创建项目的工具&#xff1a; Spring官方…

信号量——生产消费者模型

前文 在这一篇博客&#xff08;信号量博客&#xff09;中我曾经提及过信号量的知识&#xff0c;而当对信号量进行提炼总结时&#xff0c;大致是以下三点&#xff1a; 1. 信号量本质是一个计数器&#xff08;代表资源的数量&#xff09; 2. 申请信号量本质就是对资源的一种预定机…

文件系统I/O FATFS RW 源码分析

文件系统I/O FATFS RW 源码分析 0 参考 FatFs 是用于小型嵌入式系统的通用 FAT/exFAT 文件系统模块。FatFs 整个项目都按照 ANSI C (C89) 编写。与存储器 I/O 解耦良好&#xff0c;便于移植到 8051、PIC、AVR、ARM、Z80、RX 等小型微控制器中。 下面是关于 FAT 文件系统格式…

Auto-DataProcessing:一组让制作数据集变轻松的脚本

前言 最近跟同学参加了个比赛&#xff0c;我负责Object-Detection的技术实现&#xff0c;需要从网上扒大量的数据(主办方每种识别物就给了一张demo&#x1f923;)&#xff0c;发现数据准备是一个真的是一个非常重要但又耗时耗力的过程。对我来说&#xff0c;给我一类待识别的标…

蓝桥之手撕排序算法——冒泡、选择、插入、快排、归并(Python版)

目录 1. 排序引言 2. 冒泡排序 2.1 算法思想 2.2 代码实现 2.3 时空复杂度分析 3. 选择排序 3.1 算法思想 3.2 代码实现 3.3 时空复杂度分析 4. 插入排序 4.1 算法思想 4.3 代码实现 4.4 时空复杂度分析 5. 快速排序 5.1 算法思想 5.2 代码实现 5.3 时空复杂度分…

upload-labs 0.1 靶机详解

下载地址https://github.com/c0ny1/upload-labs/releases Pass-01 他让我们上传一张图片&#xff0c;我们先尝试上传一个php文件 发现他只允许上传图片格式的文件&#xff0c;我们来看看源码 我们可以看到它使用js来限制我们可以上传的内容 但是我们的浏览器是可以关闭js功能的…

【开发】SpringBoot 整合 Redis

目录 前言 1. Redis 的下载及安装 1.1 Redis 的下载 1.2 安装 Redis 1.3 启动 Redis 2. 创建 SpringBoot 项目整合 Redis 2.1 环境要求 2.2 SpringBoot项目构建 2.2.1 方式一 2.2.2 方式二 2.3 在 pom.xml 文件中导入依赖坐标 2.4 在 application.properties 中加…

解释器模式(Interpreter Pattern)

解释器模式 说明 解释器模式&#xff08;Interpreter Pattern&#xff09;属于行为型模式&#xff0c;是指给定一门语言&#xff0c;定义它的语法&#xff08;文法&#xff09;的一种表示&#xff0c;并定义一个解释器&#xff0c;该解释器使用该表示来解释语言中的句子。是一…

CVX安装新版本Mosek求解器

在使用连续凸近似&#xff08;SCA&#xff09;求解优化问题时遇到了报错 Problem status : ILL_POSED Solution status : PRIMAL_ILLPOSED_CER并且最后给出的结果为NaN。 在CVX论坛中找到一条回答 具体链接如下&#xff1a; The status is failed 因为我使用的是CVX自带的…

批量查询快递信息,固乔助手助您高效处理

在物流、供应链等行业&#xff0c;每天都需要处理大量的快递信息。无论是物流公司还是供应链企业&#xff0c;都需要实时掌握每一个包裹的状态和位置。然而&#xff0c;当面对成千上万的快递单号时&#xff0c;如何高效地查询这些信息成为了一个亟待解决的问题。 传统的查询方式…

IDEA直接打包Docker镜像

以下为使用IDEA打包Docker镜像并推送到远程仓库&#xff08;使用Windows打包Docker镜像并推送到远程仓库&#xff09;教程 1 安装Docker Desktop 下载地址&#xff1a;https://www.docker.com/products/docker-desktop/ 安装成功后&#xff0c;可在cmd查看版本号 2 启动Do…

Machine Learning ---- Feature Scaling

目录 一、What is feature scaling:&#xff1a; 二、Why do we need to perform feature scaling? 三、How to perform feature scaling: 1、Normalization: 2、Mean normalization: 3、Standardization (data needs to follow a normal distribution): 一、What is featur…

膨胀 卷积

1.作用 Dilated convolution、Atrous convolution 增大感受野保持原输入大小 2.膨胀因子 描述的是相邻元素之间的距离 r 2 3.gridding effect 不合理的多个膨胀卷积之前&#xff0c;设计的膨胀因子不合理导致&#xff0c;在增大感受野的同时丢失了细节信息。 丢失&…

【SpringCloud】使用Seata实现分布式事务

目录 一、Seata 框架的需求背景二、Seata 事务模式与架构2.1 Seata 组成2.2 Seata 事务模式 三、Seata 实战演示3.1 部署 Seata Server3.1.1 下载 Seata Server3.1.2 更改 Seata Server 配置3.1.3 创建 Seata Server 所需的数据库、数据库表3.1.4 启动 Seata Server 3.2 Seata …

判断闰年(C语言)

一、运行结果&#xff1b; 二、源代码&#xff1b; # define _CRT_SECURE_NO_WARNINGS # include <stdio.h>int main() {//初始化变量值&#xff1b;int year 2000;//执行循环判断&#xff1b;while (year < 2010){//执行流程&#xff1b;//判断能否整除4&#xff1…

十二、CyclicBarrier

CyclicBarrier 栅栏 什么时候满了开始发车 CyclicBarrier barrier new CyclicBarrier(20, () -> System.out.println("满人"));满20人开始发车每一个线程到达 barrier.await();都等着当 barrier.await();到达20人就开始往下执行 &#xff0c;发车 public…