C++类与对象(上部曲)

news2024/11/27 16:47:45

目录

面向过程和面向对象初步认识

类的引入

类的定义

类的两种定义方式:

1. 声明和定义全部放在类体中

2. 类声明放在.h文件中,成员函数定义放在.cpp文件中

类的访问限定符及封装

1 访问限定符

2 封装

类的实例化

类对象的存储方式

this指针


面向过程和面向对象初步认识


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

比如炒菜(注重过程):准备蔬菜->清洗切刀->下锅烹煮->碟碗盛放

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

再比如空气炸锅来完成食物,(注重对象):人、食物、空气炸锅

人只需要将食物送进空气炸锅,等待食物可食用即可,我们不需要关心空气炸锅怎么将食物做好

整个过程是由人、空气炸锅、食物三个对象之间的交互完成的

类的引入


C语言结构体只能定义变量,在C++中,结构体内不仅可以定义变量,也可以定义函数
以栈的实现为例,具体实现我就不写了,只构造大概框架

以下结构体的定义,在C++中更喜欢用class来代替

struct Stack
{
	//成员函数
	void Init()
	{
		a = nullptr;
		top = capacity = 0;
	}

	void Push(int x)
	{
		//……
	}
	//成员变量
	int* a;
	int top;
	int capacity;
};

int main()
{
	Stack st;
	st.Init();//访问更便利
	st.Push(1);
	st.Push(2);
	return 0;
}

类的定义
 

class className//类名
{
    // 类体:由成员函数和成员变量组成
}; // 一定要注意后面的分号

类中的变量称为类的属性或成员变量; 类中的函数称为类的方法或者成员函数


类的两种定义方式:


1. 声明和定义全部放在类体中

注意:成员函数如果在类中定义,编译器可能会将其当成内联函数处理
以栈为例:


class Stack
{
public:
	void Init()
	{
		a = nullptr;
		top = capacity = 0;
	}

	void Push(int x)
	{
		//……
	}

private:
	int* a;
	int top;
	int capacity;
};

2. 类声明放在.h文件中,成员函数定义放在.cpp文件中

更推荐这种
注意:成员函数名前需要加类名::

因为类定义了一个新的作用域,需要使用 ::作用域操作符指明成员属于哪个类域
 

//Stack.h

class Stack
{
public:
	void Init();
	void Push(int x);
private:
	int* a;
	int top;
	int capacity;
};
//Stack.cpp

#include"Stack.h"
void Stack::Init()
{
	a = nullptr;
	top = capacity = 0;
}

void Stack:: Push(int x)
{
	//……
}

类的访问限定符及封装


1 访问限定符
 

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

1 public修饰的成员在类外可以直接被访问

2 protectedprivate修饰的成员在类外不能直接被访问(此处protected和private是类似的)
访问权限作用域该访问限定符出现的位置开始直到下一个访问限定符出现时为止/后面没有访问限定符,作用域就到 } 即类结束
3 class默认访问权限为private,struct为public
 

2 封装

封装:将数据操作数据的方法进行有机结合,隐藏对象的属性和实现细节,仅对外公开接口来
和对象进行交互,也就是通过访问权限来隐藏对象内部实现细节,控制哪些方法可以在类外部直接被使用
 

类的实例化
 

类类型创建对象的过程,称为类的实例化
类是对对象进行描述的,是一个模型一样的东西,限定了类有哪些成员,定义出一个类
有分配实际的内存空间
来存储它
实例化出的对象 占用实际的物理空间,存储类成员变量

形象点来说,类就像房子的设计图纸,设计出需要什么,而实例化出的对象就是实体的房子

class Stack
{
public:
	void Init()
	{
		a = nullptr;
		top = capacity = 0;
	}

	void Push(int x)
	{
		//……
	}

private:
	int* a;
	int top;
	int capacity;
};

int main()
{
	Stack st;//实例化
    return 0;
}

类对象的存储方式

每个对象中只保存成员变量,成员函数存放在公共代码区
 

this指针
 

我们先看一段日期类Date的代码:

class Date
{
public:
	void Init(int year, int month, int day)
	{
		_year = year;
		_month = month;
		_day = day;
	}

	void Print()
	{
		cout << _year << "/" << _month << "/" << _day << endl;
	}

private:
	int _year;
	int _month;
	int _day;
};

int main()
{
	Date d1;
	Date d2;
	d1.Init(2023,7,22);
	d2.Init(2023, 7, 23);
	d1.Print();
	d2.Print();
	return 0;
}

在调用Init函数和Print函数时,它们是怎么精准区分不同对象的呢?知道该为哪个对象进行操作呢?

C++中通过引入this指针解决该问题:C++编译器给每个“非静态的成员函数“增加了一个隐藏
的指针参数
,即this指针(调用函数的对象的地址,指向该对象),让该指针指向当前对象(函数运行时调用该函数的对象),在函数体中所有“成员变量”的操作,都是通过该指针去访问
 

this指针的特性


1. this指针的类型:类类型* const,即成员函数中,不能给this指针赋值(不可对this指针本身进行修改)。
2. 只能在“成员函数”的内部使用
3. this指针本质上是“成员函数”的形参,当对象调用成员函数时,将对象地址作为实参传递给
this形参。所以对象中不存储this指针
4. this指针是“成员函数”第一个隐含的指针形参,一般情况由编译器通过ecx寄存器自动传
递,不需要用户传递

其实this指针作为函数的形参是不可用显示化的,但是可以在成员函数内部显示的使用,同时要注意不能对this指针本身进行修改

 

 

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

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

相关文章

IDEA快速创建SpringBoot

文件具有错误的版本 61.0, 应为 52.0报错可以看看是不是Springboot的版本比较高 和jdk版本不匹配 package com.qf.controller;import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframewor…

黑马 pink h5+css3+移动端前端

网页概念 网页是网站的一页,网页有很多元素组成,包括视频图片文字视频链接等等,以.htm和.html后缀结尾,俗称html文件 HTML 超文本标记语言,描述网页语言,不是编程语言,是标记语言,有标签组成 超文本指的是不光文本,还有图片视频等等标签 常用浏览器 firefox google safari…

从Vue2到Vue3【四】——Composition API(第四章)

系列文章目录 内容链接从Vue2到Vue3【零】Vue3简介从Vue2到Vue3【一】Composition API&#xff08;第一章&#xff09;从Vue2到Vue3【二】Composition API&#xff08;第二章&#xff09;从Vue2到Vue3【三】Composition API&#xff08;第三章&#xff09;从Vue2到Vue3【四】C…

os.environ[“CUDA_VISIBLE_DEVICES“]学习总结

今天发现一个很有意思的东西 import torch import os # Specify the GPU device os.environ["CUDA_VISIBLE_DEVICES"] "1" print(torch.cuda.is_available())但是如果修改下面的设置后&#xff0c;结果就变成了 import torch import os # Specify the…

【100天精通python】Day7:数据结构_列表 List的创建、删除、访问、遍历、统计、排序、推导等使用

目录 1 列表的创建 2 列表的删除 3 访问列表元素 4 遍历列表 5 添加修改删除列表元素 6 对列表进行统计和计算 7 对列表进行排序 8 列表推导式 9 多维列表 在Python中&#xff0c;列表是一种有序的可变数据类型&#xff0c;用于存储一组元素。 列表使用方括号“[] ”来…

汇编习题1-100和

.text .globl _start_start:mov r0,#0MOV r1,#0stop:cmp r1,#0x64addcc r1,r1,#0x1addcc r0,r0,r1b stop .end运行结果&#xff1a; 寄存器R0就为16进制的结果

K8S初级入门系列之四-Namespace/ConfigMap/Secret

一、前言 本章节我们继续学习Namespace、ConfigMap、Secret基础概念&#xff0c;了解他们基本用法和操作。NameSpace为命名空间&#xff0c;在同一集群中试下资源隔离。ConfigMap通过key-value的方式实现明文配置数据的保存&#xff0c;Secret与ConfigMap类似&#xff0c;不过是…

Windows下使用rocketMq

1、下载&#xff08;下载zip后解压即可&#xff09; 下载地址&#xff1a;下载 | RocketMQ 2、配置环境变量&#xff08;注意&#xff1a;该目录的下一级是bin&#xff09; 3、启动 在bin目录下使用cmd 分别输入 3.1 启动name server (下图是启动成功的显示&#xff0c;窗口…

CPU密集型和IO密集型任务的权衡:如何找到最佳平衡点

关于作者&#xff1a;CSDN内容合伙人、技术专家&#xff0c; 从零开始做日活千万级APP。 专注于分享各领域原创系列文章 &#xff0c;擅长java后端、移动开发、人工智能等&#xff0c;希望大家多多支持。 目录 一、导读二、概览三、CPU密集型与IO密集型3.1、CPU密集型3.2、I/O密…

dp算法 力扣978、力扣139、力扣467

目录 一、力扣978978. 最长湍流子数组 - 力扣&#xff08;LeetCode&#xff09; &#xff08;一&#xff09;题目详情 &#xff08;二&#xff09;算法讲解 &#xff08;三&#xff09;代码 二、力扣139139. 单词拆分 - 力扣&#xff08;LeetCode&#xff09; &#xff0…

计网学习笔记 wireless mobile networks

无线局域网的组成 无线网络在近些年来一直是个非常流行的东西。现在的移动用户数量已经大大超过了有线用户数量&#xff0c;比例大于5:1。 实现无线网络的挑战性 从有线到无线是网络构建上一个伟大的设想&#xff0c;挑战性主要集中在wireless和mobility两个点上。 这两个是…

Express 框架的基本操作

目录 1、应用生成器 2、基本路由 2.1、在跟路由下配置 GET请求&#xff0c;返回对应相应内容。 2.2、在跟路由下配置 POST请求&#xff0c;返回对应相应内容。 2.3、在跟路由下配置 PUT请求&#xff0c;返回对应相应内容。 2.4、在根路由下配置DELETE请求&#xff0c;返回对…

【剑指offer】学习计划day4

目录 一. 前言 二.数组中重复的数字 a.题目 b.题解分析 c.AC代码 三.在排序数组中查找数字 I a.题目 b.题解分析 c.AC代码 四.0&#xff5e;n-1中缺失的数字 a.题目 b.题解分析 c.AC代码 一. 前言 本系列是针对Leetcode中剑指offer学习计划的记录与思路讲解。详情查看以下…

学习系统编程No.32【线程互斥实战】

引言&#xff1a; 北京时间&#xff1a;2023/7/19/15:22&#xff0c;昨天更新完博客&#xff0c;和舍友下了一会棋&#xff0c;快乐就是这么简单&#xff0c;哈哈哈&#xff01;总体来说&#xff0c;摆烂程度得到一定的改善&#xff0c;想要达到以前的水准&#xff0c;需要一定…

分布式 - 消息队列Kafka:Kafka分区常见问题总结

文章目录 01. Kafka 的分区是什么&#xff1f;02. Kafka 为什么需要分区&#xff1f;03. Kafka 分区有什么作用&#xff1f;03. Kafka 为什么使用分区的概念而不是直接使用多个主题呢&#xff1f;04. Kafka 分区的数量有什么限制&#xff1f;05. Kafka 分区的副本有什么作用&am…

[内网渗透]XXE-vulnhub

文章目录 [内网渗透]XXE-vulnhub环境安装信息收集解题步骤总结 [内网渗透]XXE-vulnhub 环境安装 首先在 vulnhub 下载文件&#xff1a; 将其解压为ovf格式&#xff1a; 使用vmware打开&#xff0c;新建一个虚拟机&#xff0c;然后开机&#xff0c;环境就搭好了 信息收集 由于…

【仿写spring】一、通过反射读取带有@RequestMapping与@Controller注解的类并模拟请求路径调用方法

目录 简介思路实践一、自定义注解RequestMapping&#xff0c;Controller二、路径转全限定名方法三、扫描文件夹四、通过反射来寻找有RequestMapping以及Controller的类五、获取对象实例六、通过invoke调用方法 文件结构以及测试结果1、文件结构2、TestController3、测试结果 简…

uniapp 条件编译失败,跑不起来

因为这行代码整个uniapp都跑不起来&#xff0c;谁懂救命。再说uniapp的异常提示也太反人类了<!-- <image :src"require(/ baseListItem.url)" /> -->

Linux进程控制(三)---进程替换+简易shell的实现

目录 execl() execv() execlp() execvp() 如何利用execl执行自己写的C/C可执行程序&#xff1f; 如何利用makefile同时编译两个文件 execle() execvpe() 简单shell的编写 什么是进程替换&#xff1f; 我们之前fork之后&#xff0c;是父子进程各自执行代码的一部分&am…

【人工智能】大模型平台新贵——文心千帆

个人主页&#xff1a;【&#x1f60a;个人主页】 &#x1f31e;热爱编程&#xff0c;热爱生活&#x1f31e; 文章目录 前言大模型平台文心千帆发布会推理能力模型微调 作用 前言 在不久的之前我们曾讨论过在ChatGPT爆火的大环境下&#xff0c;百度推出的“中国版ChatGPT”—文…