C++类与对象this指针

news2025/1/23 9:17:51

文章目录

  • 前言
  • 一,类
    • 1.类的引入
    • 2.类的定义
    • 3.类的作用域
    • 4.类的访问限定符及封装
      • 封装
      • 访问限定符
      • 面试题
  • 二,this指针
    • 1.this指针定义
    • 2.this指针的特性

前言

从此篇往后,开始了C++的类和对象的篇章,嗯就说这么多

在这里插入图片描述

一,类

1.类的引入

C语言结构体中只能定义变量,在C++中,结构体内不仅可以定义变量,也可以定义函数。比如:
之前在数据结构初阶中,用C语言方式实现的栈,结构体中只能定义变量;现在以C++方式实现,
会发现struct中也可以定义函数

#include<iostream>
using namespace std;

typedef int DataType;
struct Stack
{
	void Init(size_t capacity)
	{
		_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;
	s.Init(10);
	s.Push(1);
	s.Push(2);
	s.Push(3);
	cout << s.Top() << endl;
	s.Destroy();
	return 0;
}

2.类的定义

class为定义类的关键字,ClassName为类的名字,{}中为类的主体,注意类定义结束时后面分
号不能省略。
类体中内容称为类的成员:类中的变量称为类的属性或成员变量; 类中的函数称为类的方法或者
成员函数。

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

注意,类的声明和定义要分成两个文件,声明在.h的头文件里,定义在.cpp的源文件里,具体实现与C语言的声明与定义分离一样

3.类的作用域

类定义了一个新的作用域,类的所有成员都在类的作用域中。在类体外定义成员时,需要使用 ::
作用域操作符指明成员属于哪个类域。

在这里插入图片描述

4.类的访问限定符及封装

封装

面向对象的三大特性:封装、继承、多态

封装:将数据和操作数据的方法进行有机结合,隐藏对象的属性和实现细节,仅对外公开接口来
和对象进行交互。

打个比方:手机就是一个封装而成的东西,手机里有内存卡,CPU等,他们被集合在一起封装成手机

访问限定符

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

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

面试题

C++中struct和class的区别是什么?

解答:C++需要兼容C语言,所以C++中struct可以当成结构体使用。另外C++中struct还可以用来
定义类。和class定义类是一样的,区别是struct定义的类默认访问权限是public,class定义的类
默认访问权限是private。

二,this指针

1.this指针定义

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

class Date
{
public:
    Date()
    {
        _year = 1900;
        _month = 1;
        _day = 1;
    }
    int  Get_day()
	{
		return _day;
	}
    //当被调用时系统会转换成以下样子
    //int  Get_day(const Date* this)
	//{
	//	return _day;
	//}
	int Get_month()
	{
		return _month;
	}
	int Get_year()
	{
		return _year;
	}
   
private:
    int _year;
    int _month;
    int _day;
};

void Test()
{
	Date d1;
    int day=d1.Get_day();;//当调用时会变成Get_day(&d1)
}

2.this指针的特性

1.this指针的类型:类型为* const,即成员函数中,不能给this指针赋值。

2.只能在“成员函数”的内部使用

3.this指针本质上是“成员函数”的形参,当对象调用成员函数时,将对象地址作为实参传递给

4.this形参。所以对象中不存储this指针(存储在栈中)。

5.this指针是“成员函数”第一个隐含的指针形参,一般情况由编译器通过ecx寄存器自动传

递,不需要用户传递

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

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

相关文章

Microsoft Forms的應用(文行版)

Microsoft Forms 功能是發起大眾投票及反饋數據的軟件。 首先要開啟Microsoft Forms 先要取得Microsoft Teams 的應用程式&#xff0c;在下載Microsoft Teams 後&#xff0c;可在最左邊的工具列選擇《應用程式》&#xff0c;然後從中開啟Microsoft Forms 就可以了。 看到Micr…

Java如何生成随机数?要不要了解一下

目录 前言一、Random类介绍二、Random类生成随机数1.生成随机数2.nextInt()方法 三、使用场景四、官方提示总结 前言 我们在学习 Java 基础时就知道可以生成随机数&#xff0c;可以为我们枯燥的学习增加那么一丢丢的乐趣。本文就来介绍 Java 随机数。 一、Random类介绍 在 Ja…

C++篇----构造函数和析构函数

在很多时候&#xff0c;当写了初始化&#xff0c;动态开辟的&#xff0c;需要写销毁函数&#xff0c;写了销毁函数之后&#xff0c;但是却忘记了调用这些函数&#xff0c;忘记调用初始化函数还好&#xff0c;编译器会报错&#xff0c;但是如果是忘记调用销毁函数&#xff0c;那…

社科院与美国杜兰大学金融管理硕士项目——选择在职读研是正确的吗

这个世界上&#xff0c;根本没有正确的选择。我们只不过要努力奋斗&#xff0c;使当初的选择变得正确。最近有咨询项目的同学总是在纠结是否要在职读研&#xff0c;在职读研是否是一条正确的路。当我们为此纠结时&#xff0c;其实只有一条路&#xff0c;那就是选择向前走。往前…

有我和另一个00后卷王后,公司老油条们破防了吗?

今年软件测试行业的内卷现象越来越明显&#xff0c;比2022年疫情那会更甚&#xff0c;越来越多的人涌入这个行业&#xff0c;而想要获得更好的待遇和机会&#xff0c;不断提升自己的技能栈成为了测试老油条不得不面对的问题。 不论是哪个级别的测试工程师&#xff0c;面试官都…

络达开发---- AB1562x左右两侧同一按钮不同功能

开发平台&#xff1a;AB1562X SDK版本&#xff1a;V1.5.2 说明&#xff1a;AB1562X支持TWS&#xff0c;左右两个的耳机的按钮在硬件上是芯片的同一个IO口&#xff1b;那如何实现左右按键对应动作&#xff21;&#xff0c;右侧按钮对应动作B呢&#xff1f;即左右两侧同一按钮的…

【创建一个网页,实现猜数字游戏】

要求如下 逻辑如下&#xff1a; 一个button按钮第二行中&#xff0c;打印“请…数字” 然后一个 输入文本框 然后一个 按钮第三行 打印 “已经猜的次数” 然后打印 猜的次数结果显示 猜大了 猜小了 猜对了 在script中 获取button按钮、输入的数据、记录count的值&#xff…

vue3——咸鱼仔

vue3——咸鱼仔 vue3——咸鱼仔P1.前言 【00:45】P2.创建项目 【02:09】P3.代码格式化 【01:37】P4.commit规范 【01:57】P5.强制commit 【02:41】P6.强制代码规范 【01:03】P7.按需导入elementplus 【02:58】P8.vue3.2新特性 【01:42】P9.初始化项目 【02:47】P10.登录页面静态…

融合开源软件治理经验,助力科技企业规避开源风险

随着开源软件的普及&#xff0c;越来越多的科技企业依赖开源软件实现业务的高速发展&#xff0c;但开源软件存在的安全合规问题&#xff0c;已成为科技企业面临的主要风险之一。 开源网安十年发展&#xff0c;通过为百度、大疆、金蝶等科技企业提供优质的软件安全产品与服务&a…

【虚幻引擎|UE4】TArray在C++中的使用

简介 TArray 类似于STL的vector&#xff0c;可以自动扩容&#xff0c;因为提供了相关操作函数&#xff0c;所以当作队列、栈、堆来使用也很方便&#xff0c;是UE4中最常用的容器类。其速度快、内存消耗小、安全性高。TArray 类型由两大属性定义&#xff1a;元素类型和可选分配…

smardaten社区版/专业版发布,查看特性与区别!

为满足个人和中小团队开发者需求&#xff0c;近期smardaten正式推出社区版与专业版&#xff0c;其中社区版为免费版本&#xff0c;支持一键下载安装。 值得一提的是&#xff0c;本次社区版和专业版&#xff0c;均支持独立私有部署&#xff0c;并进行商业应用交付。 熟悉smard…

Linux网络——Shell编程之条件语句—if 、case

Linux网络——Shell编程之条件语句—if 、case 一、条件测试1.test命令2.文件测试3.整数值比较4.逻辑测试 二、if语句1.单分支结构2.双分支结构3.多分支结构4.实践操作 三、case分支语句1.case多分支结构2.实践操作 一、条件测试 1.test命令 测试表达式是否成立&#xff0c;若…

信息收集(二)IP信息收集

信息收集&#xff08;一&#xff09;域名信息收集 什么是CDN&#xff1f; 内容分发网络&#xff08;CDN&#xff09;&#xff1a; 是指企业利用分布在不同区域的节点服务器群组成流量分配管理平台&#xff0c;为用户提供内容分散存储和高速缓存服务 在渗透测试过程中&#x…

大数据好学么

大数据本质上是海量数据。 以往的数据开发&#xff0c;需要一定的Java基础和工作经验&#xff0c;门槛高&#xff0c;入门难。 如果零基础入门数据开发行业的小伙伴&#xff0c;可以从Python语言入手。 Python语言简单易懂&#xff0c;适合零基础入门&#xff0c;在编程语言…

kafka集群模拟单节点故障

这里通过kafka manage来展示节点宕机效果 现在三台主机节点均正常 topic正常识别到三个broker leader也均匀分配到了三个broker上 现在把节点id为0的主机模拟宕机 可以通过以上两张图片看到每个topic现在只识别到了两个broker节点,broker id为0的节点已经被剔除掉了 isr列…

SpringBoot框架(邮件发送Mail|持久层框架JPA|Extra前后端分离跨域处理|接口管理Swagger)这一篇就够了(超详细)

&#x1f648;作者简介&#xff1a;练习时长两年半的Java up主 &#x1f649;个人主页&#xff1a;老茶icon &#x1f64a; ps:点赞&#x1f44d;是免费的&#xff0c;却可以让写博客的作者开兴好久好久&#x1f60e; &#x1f4da;系列专栏&#xff1a;Java全栈&#xff0c;计…

【Python表白集】没有哪个女孩子 不喜欢花 不喜欢惊喜:“一束花的仪式感,永远不会过时呢~”(turtle绘图代码)

导语 “我想和你在一起虚度时光&#xff0c;坐看云卷云舒&#xff0c;花开花落” 所有文章完整的素材源码都在&#x1f447;&#x1f447; 粉丝白嫖源码福利&#xff0c;请移步至CSDN社区或文末公众hao即可免费。 又快到了一年小长假的时候啦&#xff0c; 单身狗的你们还好嘛…

如何有效使用渲染农场?防止渲染出错的7个方法!

如何使用渲染农场&#xff1f;又如何有效地使用渲染农场&#xff0c;使用云渲染农场时出错怎么办&#xff1f; 众所周知我们可以在任意的笔记本或者终端PC上面来创作 3ds Max 场景&#xff0c;但是实际渲染是这样吗&#xff1f;其实不然&#xff0c;这其中的差距不是一星半点&…

在 iOS 16 中用 SwiftUI Charts 创建一个折线图

前言 苹果在 WWDC 2022 上推出了 SwiftUI 图表&#xff0c;这使得在 SwiftUI 视图中创建图表变得异常简单。图表是以丰富的格式呈现可视化数据的一种很好的方式&#xff0c;而且易于理解。本文展示了如何用比以前从头开始创建同样的折线图少得多的代码轻松创建折线图。此外&am…

Spring Security环境搭建

Spring Security环境搭建 Spring BootSpring Security 认证&#xff1a;判断用户是否是用户合法用户的过程授权&#xff1a;判断系统用户可以访问或访问哪些权限资源 环境搭建 创建springBoot项目并导入springsecurity相关的依赖。 <dependencies><dependency>…