c++类与对象一

news2024/11/15 14:01:28

C++类与对象(一)

面向对象初步认识

在c语言中,编程是面向过程编程,注重求解问题列出过程,然后调用函数求解问题。

在日常生活中。我们经常会遇到面向过程的问题

手洗衣服就是面向过程

image-20240920104258079

而C++是基于面向对象的。关注的是对象,把事情拆分成多个不同的对象,靠对象与对象之间的交互。

在洗衣服整个过程分成四个对象:人、洗衣机、衣服、洗衣粉

人只需要把衣服和洗衣服丢进洗衣机,然后设定好洗衣机的洗涤步骤,就可以等待洗衣机把衣服洗了并甩干。

整个过程中,只有对象与对象的交互,人不需要关心衣服是怎么被洗干净并且甩干的。

image-20240920105346868

类的引入

在C语言中,如果我们写一个栈,就必须要用到struct结构体,而这里面只能定义变量。而在C++中,重新赋予了struct新的权力,就是也能在里面定义函数了。

typedef int DataType;
struct Stack
{
	//定义栈的变量
	DataType* _array;
	int _capacity;
	int _size;
	
	//栈初始化
	void Init(size_t capacity) {
		_array = (DataType*)malloc(sizeof(DataType) * capacity);
		if (_array) {
			perror("malloc fail");
			exit(-1);
		}
		_capacity = capacity;
		_size = 0;
	}
	//入栈
	void Push(const DataType& data) {
		_array[_size] = data;
		_size++;
	}
	//获取栈顶元素
	DataType Top() {
		return _array[_size - 1];
	}
	//销毁栈
	void Destory() {

		if (_array) {
			free(_array);
			_array = nullptr;
			_capacity = 0;
			_size = 0;
		}
	}
};

int main() {
	Stack s;
	s.Init(10);
	s.Push(1);
	s.Push(2);
	s.Push(3);
	s.Top();
	s.Destory();

	return 0;
}

类的定义

在C++中,类的定义一般用class

class Myclass {
	//一般由成员变量和成员函数构成
	int _size;
	int capacity;
	void Init() {
		//......
	}
};//跟sturct一样,必须有分号

class是类关键字,Myclass是类名,可以自定义。

类中的内容称为类成员,内部变量称为成员变量,内部函数称为成员函数

类的两种定义方法

一、声明和定义全部放在类里面。注意:如果将函数的定义放在类里,编译器会将其当做内联函数处理。

class Myclass {

public:
	int num;
	int size;
	//....

public:
	int Add(int a, int b) {
		return a + b;
	}//内联函数
	//....
};

二、类声明放在头文件(.h)中,定义放在(.cpp)文件中。

类的声明

image-20240921104510110

class MyClass
{
public:
	int Add(int a, int b);
	//....

public:
	int sum;
	int size;
	//....
};

类成员的定义

#include "test01.h"
int MyClass::Add(int a, int b) {
	return a + b;
}

注意:成员函数前必须加上类名

建议:在个人日常中写题目推荐第一种写法,在项目或者工作中,推荐第二种写法

成员变量命名规则建议

大家看下列函数,是不是非常的别扭,通过Time(int year,int month,int day)这个函数成员变量赋值,形参和实参完全相同,因此我们要重新给成员变量赋上新的命名规则(习俗)

class Date {

public:
	int Time(int year, int month, int day) {
		year = year;
		month = month;
		day = day;
	}
private:
	int year;
	int month;
	int day;
};

在每个成员变量加上_就很容易看懂我们要给那一个变量赋值,提高代码可读性。

class Date {

public:
	int Time(int year, int month, int day) {
		_year = year;
		_month = month;
		_day = day;
	}
private:
	int _year;
	int _month;
	int _day;
};

或者这样

class Date {

public:
	int Time(int year, int month, int day) {
		Ayear = year;
		Amonth = month;
		Aday = day;
	}
private:
	int Ayear;
	int Amonth;
	int Aday;
};

总之,这些命名就是为了区分变量,从而提供可读性,因此可以根据自己的需求来命名。

类的访问限定及封装

访问限定符

image-20240921110405071

说明:

一、public修饰的成员,可以直接在类外面访问

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

三、权限访问限定作用域从该访问限定符出现的位置一直到下一个访问限定符出现位置

四、如果后面没有限定访问符,作用域到’}'(类结束为止)

五、class的默认权限是privatestruct默认的权限是public(class和struct的区别)

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

封装

封装本质上是一种管理,让用户更方便使用类。

在用户日常使用计算机的过程,通过计算机提供的USB接口,或键盘输入,显示器等交互来完成工作。而实际上,计算机中真正工作的是CPU、GPU等内部元件。

对于用户而言,不需要担心内部的部件,例如主板是如何布线的,CPU内部是如何工作的,用户只需要怎么开关机,怎么通过鼠标和键盘和计算机交互。在计算机出厂时,厂家通过机箱将这些封装好,把内部细节隐藏起来,仅仅对外提供USB接口、开关机按钮等交互接口就可以让用户和计算机交互。

在C++中,可以通过类将数据以及操作数据的方法进行有机结合,通过访问权限来隐藏类内部的实现细节,控制那些方法可以直接被外部使用。

类的作用域

类定义了一个新的作用域,使用类的所有成员,必须要加上类的作用域限定符::

头文件test01.h定义类

//test01.h
class Date {
public:
	int Time(int year, int month, int day);
private:
	int _year;
	int _month;
	int _day;
};

test01.cpp中声明类的成员

#include "test01.h"
int Date::Time(int year,int month,int day)
{
	Date::_year = year;
	Date::_month;
	Date::_day;
}

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

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

相关文章

SpringSecurity -- 入门使用

文章目录 什么是 SpringSesurity ?细节使用方法 什么是 SpringSesurity ? 在我们的开发中,安全还是有些必要的 用 拦截器 和 过滤器 写代码还是比较麻烦。 SpringSecurity 是 SpringBoot 的底层安全默认选型。一般我们需要认证和授权&#xf…

【Finetune】(三)、transformers之P-Tuning微调

文章目录 0、P-Tuning基本原理1、代码实战1.1、导包1.2、加载数据集1.3、数据集预处理1.4、创建模型1.5、P-tuning*1.5.1、配置文件1.5.2、创建模型 1.6、配置训练参数1.7、创建训练器1.8、模型训练1.9、模型推理 0、P-Tuning基本原理 P-Tuning的基本思想是在prompt-tuning的基…

Spring Boot管理用户数据

目录 学习目标前言Thymeleaf 模板JSON 数据步骤 1: 创建 Spring Boot 项目使用 Spring Initializr 创建项目使用 IDE 创建项目 步骤 2: 添加依赖步骤 3: 创建 Controller步骤 4: 新建index页面步骤 5: 运行应用程序 表单提交步骤 1: 添加 Thymeleaf 依赖在 Maven 中添加依赖 步…

Vue3.3新特性defineModel

defineModel的使用: defineModel选项可以帮我们省去很多麻烦 不仅需要上述操作,还需要进行一定的配置: 在vite.config.js中进行配置 defineModel是一个宏,所以不需要从vue中import导入,直接使用就可以了。这个宏可以用来声明一个…

Java之线程篇六

目录 CAS CAS伪代码 CAS的应用 实现原子类 实现自旋锁 CAS的ABA问题 ABA问题导致BUG的例子 相关面试题 synchronized原理 synchronized特性 加锁过程 相关面试题 Callable 相关面试题 JUC的常见类 ReentrantLock ReentrantLock 和 synchronized 的区别: 原…

Android 新增目录怎么加入git

工作中会遇到android系统源码系统增加第三方功能支持,需要增加目录,那么这个目录怎么提交到服务器上去呢?接下来我们就看下这个问题的解决 一服务器创建仓库 一个新的目录增加到仓库中,需要仓库有对应的仓库地址,这个让…

小记编程语言浮点精度问题

注意: 本文内容于 2024-09-15 20:21:12 创建,可能不会在此平台上进行更新。如果您希望查看最新版本或更多相关内容,请访问原文地址:小记编程语言浮点精度问题。感谢您的关注与支持! 浮点数在计算机中不能精确表示所有…

docker启动mysql未读取my.cnf配置文件问题

描述 在做mysql主从复制配置两台mysql时,从节点的my.cnf配置为: [mysqld] datadir /usr/local/mysql/slave1/data character-set-server utf8 lower-case-table-names 1 # 主从复制-从机配置# 从服务器唯一 ID server-id 2 # 启用中继日志 relay-l…

【小沐学CAD】3ds Max常见操作汇总

文章目录 1、简介2、二次开发2.1 C 和 3ds Max C SDK2.2 NET 和 3ds Max .NET API2.3 3ds Max 中的 Python 脚本2.4 3ds Max 中的 MAXScript 脚本 3、快捷键3.1 3Dmax键快捷键命令——按字母排序3.2 3dmax快捷键命令——数字键3.3 3dmax功能键快捷键命令3.4 3Dmax常用快捷键——…

对网页聊天项目进行性能测试, 使用JMeter对于基于WebSocket开发的webChat项目的聊天功能进行测试

登录功能 包括接口的设置和csv文件配置 ​​​​​​ 这里csv文件就是使用xlsx保存数据, 然后在浏览器找个网址转成csv文件 注册功能 这里因为需要每次注册的账号不能相同, 所以用了时间函数来当用户名, 保证尽可能的给正确的注册数据, 时间函数使用方法如下 这里输入分钟, 秒…

肝内胆管癌中三级淋巴结构分布与临床预后的相关性研究|文献精析·24-09-22

小罗碎碎念 这篇文章是关于肝内胆管癌(intrahepatic cholangiocarcinoma, iCCA)中三级淋巴结构(tertiary lymphoid structures, TLSs)的分布、密度及其对临床结果的预测价值的研究。 作者类型作者姓名单位名称(中文&a…

数据结构——串的模式匹配算法(BF算法和KMP算法)

算法目的: 确定主串中所含子串(模式串)第一次出现的位置(定位) 算法应用: 搜索引擎、拼写检查、语言翻译、数据压缩 算法种类: BF算法(Brute-Force,又称古典的…

【洛谷】P10417 [蓝桥杯 2023 国 A] 第 K 小的和 的题解

【洛谷】P10417 [蓝桥杯 2023 国 A] 第 K 小的和 的题解 题目传送门 题解 CSP-S1 补全程序,致敬全 A 的答案,和神奇的预言家。 写一下这篇的题解说不定能加 CSP 2024 的 RP 首先看到 k k k 这么大的一个常数,就想到了二分。然后写一个判…

《深入理解JAVA虚拟机(第2版)》- 第13章 - 学习笔记【终章】

第13章 线程安全与锁优化 13.1 概述 面向过程的编程思想 将数据和过程独立分开,数据是问题空间中的客体,程序代码是用来处理数据的,这种站在计算机角度来抽象和解决问题的思维方式,称为面向对象的编程思想。 面向对象的编程思想…

一劳永逸:用脚本实现夸克网盘内容自动更新

系统环境:debian/ubuntu 、 安装了python3 原作者项目:https://github.com/Cp0204/quark-auto-save 感谢 缘起 我喜欢看电影追剧,会经常转存一些资源到夸克网盘,电影还好,如果是电视剧,麻烦就来了。 对于一…

Kettle的安装及简单使用

Kettle的安装及简单使用一、kettle概述二、kettle安装部署和使用Windows下安装案例1:MySQL to MySQL案例2:使用作业执行上述转换,并且额外在表stu2中添加一条数据案例3:将hive表的数据输出到hdfs案例4:读取hdfs文件并将…

Jboss常⻅中间件漏洞

一.CVE-2015-7501 环境搭建 cd vulhub-master/jboss/JMXInvokerServlet-deserialization docker-compose up -d 1.POC,访问地址 172.16.1.4:8080/invoker/JMXInvokerServlet 返回如下,说明接⼝开放,此接⼝存在反序列化漏洞 2.下载 ysose…

7.C++程序中的基本数据类型-数据类型之间的转换

在C中,类型转换是将一个数据类型转为另外一个数据类型,其转换过程比较复杂,目前只讨论基本数据类型之间的转换。 类型转换分为两部分:隐式转换和显示转换 隐式转换又称为自动转换,显示转换又称为强制转换。 隐式转换…

[Linux] Linux进程PCB内部信息的深入理解

标题:[Linux] Linux进程PCB内部信息的深入理解 个人主页:水墨不写bug (图片来自网络) 目录 一.查看进程 二.认识并了解进程的关键信息 I,PID/PPID II,exe III,cwd 三、fork(&…

vue源码分析(九)—— 合并配置

文章目录 前言1.vue cli 创建一个基本的vue2 项目2.将mian.js文件改成如下3. 运行结果及其疑问? 一、使用 new Vue 创建过程的 2 种场景二、margeOption的详细说明1.margeOption的方法地址2.合并策略的具体使用3.defaultStrat 默认策略方法 三:以生命周期…