【C++】类和对象<上>(类的定义,类域,实例化,this指针)

news2024/9/29 18:29:07

目录

一. 类的定义

【对比c】结构体和类的区别

1. 称呼:变量 or 对象? 

2. 类型:

3. 访问限定:

4. c和c++结构体使用

5. 相同点: 

二. 类域

三. 实例化

1. 1对N

2. 计算大小只考虑成员变量

3. 到此一游

四. this指针

this的隐藏使用

注意:

this作用:

题目深刻理解this 


一. 类的定义

< c++中,类可以用class关键词实现,也可以用结构体struct实现 >

以下是class关键词的使用

如下代码, class为定义类的关键字,Stack为你取的类的名字,{ }内为类的主体

class Stack
{
	//成员变量
	int* array;
	size_t capacity;
	size_t top;


	//成员函数
	void Init(int capacity = 4)
	{

	}
};

注意一:也许会遇上如下初始化的时候,capacity(成员变量) = capacity(函数创建的临时变量)

区分方法:定义成员变量可以在变量前加标识符“_”

class Stack
{
	//成员变量
	//定义成员变量可以在变量前加标识符“_”
	int* _array;//如 int* _array 或者 array_ 
	size_t _capacity;//加标识符是为了方便区分如下函数Init的初始化谁是谁
	size_t _top;

	//成员函数
	void Init(int capacity = 4)
	{
		//一目了然,左边是成员变量,右边是函数接收传参的临时变量
		_capacity = capacity;
	}
};

注意二

【对比c】结构体和类的区别

以下是我们定义数据结构中“栈”用结构体两种形式的代码

//定义栈的结构体
typedef int STDataType;
typedef struct Stack
{
	STDataType* arr;
	int capacity;
	int top;
}ST;


//Stack类
class Stack
{
	//成员变量
	int* array;
	size_t capacity;
	size_t top;
}

1. 称呼:变量 or 对象? 

2. 类型:

  • 结构体的类型是 struct Stack(除非你取typedef 类型名称)
  • 类的类型直接就是 Stack

3. 访问限定:

扩展知识:c++访问限定符

共有(public) :类外也可以访问(如也可以在main中使用)

私有(private):只允许类内访问

  • 结构体默认公有(c++也可以对结构体进行自定义共有和私有)
  • 默认私有(没加访问限定符的时候
  • 类可以自定义 共有(public) 和 私有(private)

结构体

4. c和c++结构体使用

c++比c语言多了可以在结构体里写函数 ,且c++的结构体不用typedf也能直接省略struct做类名 

c++创建结构体

5. 相同点: 

调用对象/函数  .

调用指针 ->

   Stack.Init(); 
   ST.Init();

   Stack->arr;
   ST->arr;

二. 类域

.c++一共有四大域:函数局部域、全局域、命名空间域和类域。

而我们之前在类中定义的成员函数和成员变量,就属于类域

通俗说,不同类域相当于不同家族,不同家族里可以都叫“张伟”不会混,相同家族就有可能。

函数 声明定义分离 要 指定类域

声明与定义区分的根本是:是否有开辟空间

  • 声明:系统未给开辟空间
  • 定义:系统给开辟了空间

头文件定义后,在源文件使用要声明类

格式:     函数返回类型 类名:: 函数名(传参列表)

                              void  Stack:: Init (int n)

举例来说 如下就是标准的类的声明和定义分离

在Stack.cpp文件中指定我们要查找的函数Init(),前面带上指定的类域

Stack.h

复习一下:(缺省参数在声明和定义都在的时候只能给声明,不能给定义) 

//这是你头文件定义的类的基本结构
class Stack
{
public:
    void Init(int n = 4);//缺省参数在声明和定义都在的时候只能给声明,不能给定义
 
private:
    int* _a;
    int top;
    int _capacity;
};

 Stack.cpp

为了让编译器找到类中的函数,我们需要在前面加上 Stack:: 指定类域

#include"Stack.h"
 
//我们在类外面定义函数
void Stack::Init(int n )
{
    //...
}

三. 实例化

这是我之前写的博客内容

1. 1对N

一个类可以实例化多个对象

2. 计算大小只考虑成员变量

不包含成员函数

计算方式遵循内存对齐原则

内存对齐原则

3. 到此一游

当类中只有成员函数或者类为空类时,其所创建的对象大小为1字节,纯属占位作用

四. this指针

this的隐藏使用

代码引入

#include <iostream>
using namespace std;
 
class MyClass
{
public:
	MyClass(int a = 0, float b = 0, char c = 0)//构造函数,用于初始化对象的成员变量,后续会给大家介绍
	{
		_a = a;
		_b = b;
		_c = c;
	}
	void Print()
	{
		cout << _a << endl;
		cout << _b << endl;
		cout << _c << endl;
	}
private:
	int _a;
	float _b;
	char _c;
};
 
int main()
{
	MyClass m = { 1,5.5,'w' };
	m.Print();
}

如上print函数没有参数,为什么能准确传参?

实际上,这里的Print函数的参数的第一个位置,存在一个隐含的this指针

该函数调用当中的this指针指向的是对象m,自动访问其地址

注意:

形参和实参传参列表(this指针会自动在参数第一个位置生成)不可直接使用this,仅可在类的成员函数中使用。 

this作用:

1. 当我们需要使成员函数返回该对象的地址,就可以return this;
2. 当函数内的局部变量与类的成员变量名发生冲突时,就可以在类成员前加上this->,便于区分。

题目深刻理解this 

1. 以下代码的运行结果是? 

#include <iostream>
using namespace std;
 
class MyClass
{
public:
	void Print()
	{
		cout << "hehe" << endl;
	}
private:
	int _a;
};
 
int main()
{
	MyClass* a = nullptr;
	a->Print();
}

题目简单说,就是创建类指针a,并调用函数Print

答案正常运行,打印“hehe”。

解析:虽然使用了“->”,但是并没有对空指针a进行解引用,本质是将a传递给了形参this指针

没有解引用→没有访问成员变量,只打印了“hehe”,所以不会发生问题,程序正常运行。

疑问:为什么没有解引用a?

对象只存储成员变量的地址,不存储成员函数地址)

(因此print函数地址未存储,不会被对象解引,因此不出错)

2. 以下代码的运行结果是? 

#include <iostream>
using namespace std;
 
class MyClass
{
public:
	void Print()
	{
		cout << _a << endl;
	}
private:
	int _a;
};
 
int main()
{
	MyClass* a = nullptr;
	a->Print();
}

答案运行崩溃。

 解析:函数内部访问成员变量_a,_a本质是由this指针解引用访问到的

出现空指针解引用的问题,运行崩溃。

希望对你有帮助

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

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

相关文章

【深度学习】04-Cnn卷积神经网络-01- 卷积神经网络概述/卷积层/池化层/分类案例精讲

卷积神经网络&#xff08;CNN&#xff0c;Convolutional Neural Network&#xff09;是专门用于处理图像数据的神经网络。 图像的基本概念 图像其实是数组&#xff1a; ndarray -> [高&#xff0c;宽&#xff0c;3通道] --> uint8 每个值取值范围0-255&#xff0c;那么…

高空抛物AI检测算法:精准防控,技术革新守护城市安全

近年来&#xff0c;随着城市化进程的加速&#xff0c;高楼大厦如雨后春笋般涌现&#xff0c;但随之而来的高空抛物问题却成为城市管理的一大难题。高空抛物不仅严重威胁行人的安全&#xff0c;还可能引发法律纠纷和社会问题。为了有效预防和减少高空抛物事件的发生&#xff0c;…

pnpm依赖安装失败解决|pnpm项目从一个文件夹复制到另一个文件夹运行失败问题解决-以vbenAdmin项目为例

1 前言 最近在使用vben admin项目迁移时&#xff0c;从一个文件夹复制到另一个文件夹运行不起来&#xff0c;排查了一天&#xff0c;终于把问题排查出来了&#xff0c;特地记录一下&#xff0c;便于自己看也便于大家看。 使用项目安装包版本&#xff1a; v2.11.5 https://gi…

【产教融合】新媒体产业园携手高校,共育数字创意人才

在新媒体浪潮的推动下&#xff0c;数字创意产业正以前所未有的速度蓬勃发展。为了应对这一趋势&#xff0c;新媒体产业园积极响应“产教融合”的号召&#xff0c;携手国内多所顶尖高校&#xff0c;共同开启数字创意人才培养的新篇章。 树莓集团一直以来都在新媒体领域有着卓越的…

uni-app如果自定义tabbar实现底部样式有凸起效果,背景带圆角

想要实现的效果、 大部分可以参考这一篇文章 小程序弹出框是没办法遮挡住底部的tabbar的&#xff0c;解决的办法是使用自定义tabbar。。uni-app小程序如何自定义tabbar-CSDN博客 我们只要改下index.wxml和index. wxs的代码就行了 <view class"tab-bar"><b…

stm32 bootloader跳转程序设计

文章目录 1、bootloader跳转程序设计&#xff08;1&#xff09;跳转程序&#xff08;2&#xff09;、app程序中需要注意<1>、在keil中ROM起始地址和分配的空间大小<2>、在system_stm32f4xx.c中设置VECT_TAB_OFFSET为需要偏移的地址<3>、main函数中使能中断 总…

浅析 Keil 中的 sct 文件

目录 一、程序的存储与运行1、存储2、加载、运行 二、sct 分散加载文件1、简介2、文件格式2.1 加载域2.2 执行域2.3 输入节区描述 3、配置 sct 文件 一、程序的存储与运行 1、存储 程序编译后&#xff0c;应用程序中所有具有同一性质的数据(包括代码)被归到一个域&#xff0c…

Java必修课——Spring框架

目录 一、Spring框架概述二、IOC概念和原理2.1、什么是IOC2.2、IOC接口 三、深入理解Java基础中的集合框架3.1、Collection3.2、Map3.3、集合工具类 四、练习写一个SpringMVC框架1、介绍2、程序实践3、总结 五、Java开发者必备10大数据工具和框架 一、Spring框架概述 Spring是…

从追随者到领跑者:suker书客如何粉碎技术障碍,成就行业传奇

护眼灯从小众需求逐渐走向了大众消费&#xff0c;一度引来许多品牌的相继入场&#xff0c;以吸顶灯、吊灯、台灯和落地灯等各大护眼品类为代表&#xff0c;均在悄然替代普通的台灯&#xff0c;这同时也揭示了关于护眼灯的发展潜力。 一些企业看到护眼灯市场前景后&#xff0c;…

煤矿厂智能化可视化:提升安全与效率

运用图扑可视化技术对煤矿厂进行实时监控与数据分析&#xff0c;提高安全管理水平和生产效率。

C语言基础之数组

上一篇讲述了C语言函数的使用&#xff0c;本文讲述数组的相关概念&#xff0c;通过一维数组、二维数组、数组越界等详细讲解数组相关的具体内容&#xff0c;以辅助读者了解并掌握数组相关概念。 一维数组 一维数组的定义与创建 若无数组&#xff0c;我们要存储一堆类型相同的…

osalTaskREC_t ‘REC’缩写的含义

osalTaskREC_t中‘REC’缩写的含义。 在osal中定义了 osalTimerRec_t&#xff0c; osalTaskRec_t 结构体&#xff0c;那么osal源码中类型名 osalTaskREC_t中‘REC’缩写的含义是什么&#xff1f; 查了下往上资料&#xff0c;rec应该是 Record&#xff08;记录&#xff09;’的…

AI大模型之旅-最强开源文生图工具Stable Diffusion WebUI 教程

1.1克隆 Automatic1111 的 GitHub 仓库 在你想安装 Web UI 的文件夹路径下执行 git clone https://github.com/AUTOMATIC1111/stable-diffusion-webui 这将会克隆整个仓库到本地。 这里会默认访问 https://huggingface.co/ 下载 因此需要魔法 1.2 进入仓库目录 cd stable-di…

手机改IP地址怎么弄?全面解析与操作指南

在当今数字化时代&#xff0c;IP地址作为设备在网络中的唯一标识&#xff0c;其重要性不言而喻。有时候&#xff0c;出于隐私保护、网络访问需求或其他特定原因&#xff0c;我们可能需要更改手机的IP地址。然而&#xff0c;对于大多数普通用户来说&#xff0c;如何操作可能还是…

Xshell调用powershell连接Teleport

公司最近切换telport管理SSH的连接访问。配置完成后&#xff0c;通过powershell可能远程访问。但是powershell缺少session管理功能&#xff0c;每次连接都记不住远程IP&#xff0c;很是头疼。 利用Xshell的管理能力是否可行&#xff1f;那是相当可行。 首先&#xff0c;新建se…

环境变量配置文件

环境变量配置文件 系统级配置文件 /etc/profile 系统范围的配置文件&#xff0c;适用于所有用户的登录 shell。 定义了系统级别的环境变量&#xff0c;并调用其他配置文件&#xff08;如 /etc/bash.bashrc&#xff09;。 /etc/bash.bashrc 非登录 shell 的全局配置文件。 在系…

Java异步编程:初学者快速入门到精通指南

异步编程简介 异步编程允许程序在执行某些操作&#xff08;如网络请求、文件I/O等&#xff09;时不被阻塞&#xff0c;能够继续执行其他任务。这不仅可以提高程序的响应性&#xff0c;还能提升资源的利用率。 为什么选择Java进行异步编程&#xff1f; Java提供了多种异步编程…

Echarts折线图的末尾部分线条虚线

原理&#xff1a;等于画了两条线&#xff0c;一条实线一条虚线&#xff1b;把实线的最后的值给虚线&#xff1b;再将提示框进行过滤&#xff0c;防止多个点以及值为空的情况 初步实现参考&#xff1a; option {xAxis: {type: category,data: [Mon, Tue, Wed, Thu, Fri, Sat, …

《低空经济:文旅行业的新引擎 》

《低空经济&#xff1a;文旅行业的新引擎 》 一、低空经济与文旅行业的融合态势 低空经济作为新兴经济形态&#xff0c;正与文旅行业深度融合&#xff0c;为文旅发展带来新机遇。 近年来&#xff0c;随着科技的不断进步和人们对旅游体验的不断追求&#xff0c;低空经济与文旅…

js列表数据时间排序和取唯一值

1.取唯一值[...new Set(array)] const array [1, 2, 3, 2, 4, 5, 3, 5]; // 使用Set去除重复元素 const uniarray [...new Set(array)]; console.log(uniarray); // 输出: [1, 2, 3, 4, 5] 2.排序 var u [1,3,2,5,4]; var uu u.sort(); console.log(uu); var u [1,3…