类和对象的概述以及this指针的应用

2024-09-07 21:04
文章标签 指针 应用 概述 对象

本文主要是介绍类和对象的概述以及this指针的应用,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

定义

  1. 类是一种用户自定义的复合数据类型,即包括表达属性的成员变量,也包括表达行为的成员函数                                                                                                                                         
  2. 类可用于表达那些不能直接与内置基本类型建立自然映射关系的逻辑抽象
  3. 类是现实世界的抽象,对象是类在虚拟世界的实例

类的定义 

  • 访问控制限定符 
  • public---公有成员---谁都可以访问
  • protected---保护成员---只有自己和子类可以访问
  • private---私有成员---只有自己可以访问

在C++中,类(class)和结构(struct)已没有本质性的差别,唯一的不同在于

        类的缺省访问控制属性为私有(private)

        结构的缺省访问控制属性为公有(public)

访问控制限定符仅作用于类,而非作用于对象。

对不同成员的访问控制属性加以区分,体现了C++作为面向对象程序设计语言的封装特性

对象的创建过程

        我们创建一个对象后会给这个对象分配内存空间,然后定义占据这部分内存空间的成员变量。

代码演示

// 类:抽取事物特征的规则
#include <iostream>
#include <cstring>
using namespace std;
//struct
class Human {
public:void setinfo( int age=0, const char* name="无名" ) {// 桥梁函数if( !strcmp(name,"憨憨") ) {cout << "你才憨呢" << endl;return;}m_age = age;strcpy( m_name, name );}void getinfo() {cout << "姓名:" << m_name << ", 年龄:" << m_age << endl;}
private:int m_age; // 声明char m_name[256]; // 声明
};
// 以上的代码模拟类的设计者(C++标准库提供,第三方提供,自己设计的)
// ------------------------------------------------
// 以下的代码模拟类的使用者
int main( void ) {Human h; // 定义h(给h分配内存空间)// 在h所占内存空间中 定义m_age,初值为随机数// 在h所占内存空间中 定义m_name,初值为随机数cout << "h对象的大小:" << sizeof(h) << endl; // 260h.setinfo( 22, "张飞" );h.setinfo( 22, "憨憨" );h.getinfo();
//    h.m_age = 22;
//    strcpy( h.m_name, "张飞" );
//    strcpy( h.m_name, "憨憨" );
//    cout << "姓名:" << h.m_name << ", 年龄:" << h.m_age << endl;return 0;
}

成员函数参数---this

C++对象模型          

  • 同一个类的不同对象各自拥有一份独立的成员变量。
  • 同一个类的不同对象彼此共享同一份成员函数。
  • 那么在代码区中,被同一个类的不同对象所共享的成员函数,在这些成员函数内部,如何区分其所访问的成员变量隶属于哪个对象?   

C++成员函数模型

  • 类的每个成员函数(除静态成员函数外),都有一个隐藏的指针型参数,形参名为 this,指向调用该成员函数的对象,这就是this指针.
  • 在类的成员函数中(除静态成员函数外),对所有成员的访问,都是通过this指针进行的

 代码演示

// 类:抽取事物特征的规则
#include <iostream>
#include <cstring>
using namespace std;
// 当前程序有2个对象(h/h2),每个对象各有一份成员变量(m_age/m_name),共有两份成员变量
class Human {
public: // _ZN5Human7setinfoEiPKcvoid setinfo( /* Human* this */ int age=0, const char* name="无名" ) {this->m_age = age;strcpy( this->m_name, name );}void getinfo( /* Human* this */ ) { // _ZN5Human7getinfoEvcout << "姓名:" << this->m_name << ", 年龄:" << this->m_age << endl;}
private:int m_age; // 声明char m_name[256]; // 声明
};
// 以上的代码模拟类的设计者(C++标准库提供,第三方提供,自己设计的)
// ------------------------------------------------
// 以下的代码模拟类的使用者
int main( void ) {Human h; // 定义h(给h分配内存空间)// 在h所占内存空间中 定义m_age,初值为随机数// 在h所占内存空间中 定义m_name,初值为随机数cout << "h对象的大小:" << sizeof(h) << endl; // 260h.setinfo( 22, "张飞" ); // _ZN5Human7setinfoEiPKc(&h,...);h.getinfo(); // _ZN5Human7getinfoEv(&h)Human h2; // 定义h2(给h2分配内存空间)// 在h2所占内存空间中 定义m_age,初值为随机数// 在h2所占内存空间中 定义m_name,初值为随机数cout << "h2对象的大小:" << sizeof(h2) << endl; // 260h2.setinfo( 25, "关羽" );// _ZN5Human7setinfoEiPKc(&h2,...);h2.getinfo();// _ZN5Human7getinfoEv(&h2)return 0;
}

this指针的应用

  1. 多数情况下,程序并不需要显式地使用this指针
  2. 有时为了方便,将类的成员变量与该类成员函数的参数取相同标识符,这时在成员函数内部,可通过this指针将二者加以区分
  3. 返回基于this指针的自引用,以支持串连调用
  4. 将this指针作为函数的参数,以实现对象交互

 代码演示

// 必须自己写this的情况
#include <iostream>
using namespace std;
class Integer; // 短式声明
void Print( Integer* v ) {// ...
}
class Integer {
public:void setinfo( /* Integer* this */ int i ) {this->i = i; // (1)必须自己添加this}void getinfo( /* Integer* this */ ) {cout << /*this->*/i << endl; // 这里的this编译器补Print( this ); //(3)必须自己写this}Integer& increment( /* Integer* this */ ) {++/*this->*/i;return *this; //(2) 返回基于this指针的自引用}
private:int i; 
};
// 以上的代码模拟类的设计者(C++标准库提供,第三方提供,自己设计的)
// ------------------------------------------------
// 以下的代码模拟类的使用者
int main( void ) {Integer ix;ix.setinfo( 666 );ix.getinfo();ix.increment().increment().increment(); // 串联调用ix.getinfo();return 0;
}

        例三讲解:返回基于this指针的自引用,以支持串连调用

Integer& increment( /* Integer* this */ ) {++/*this->*/i;return *this; //(2) 返回基于this指针的自引用
}

   this 指针是一个指向当前对象的指针。对于返回基于 this 指针的自引用的 increment() 方法,它返回的是当前对象本身的引用,因此可以理解为返回的是对象 ix 的引用。 

 总结:返回的是 ix 还是 ix.increment()?

每次调用 increment() 都返回当前对象的引用(也就是 ix 的引用)。因为返回的是引用,所以每次调用 increment() 后,你可以继续对返回的对象(即 ix)调用 increment()。这使得你能够像 ix.increment().increment().increment(); 这样的串联调用。

  • 返回的引用是什么? 每次 increment() 调用返回的都是 ix 本身的引用。
  • 串联调用的效果:这条语句的效果是连续调用了 increment() 三次,实际上是对同一个对象 ix 进行了三次自增操作。

 例四讲解:将this指针作为函数的参数,以实现对象交互

void getinfo() {Print(this);  // 这里的 `this` 是指向当前 Integer 对象的指针
}
Integer ix;
ix.getinfo();
  • 当调用 ix.getinfo(); 时,ix 就是“当前对象”。
  • 在 getinfo() 方法内部,this 指针指向 ix。
  • 当调用 Print(this); 时,实际上你是将 ix 的地址传递给 Print 函数。

所以,当前对象就是 ix,而this 指向的也是 ix。

总结

  • 当前对象 是指正在调用某个非静态成员函数的对象。
  • this 指针在成员函数内部指向当前对象,使得成员函数能够访问该对象的成员变量和成员函数。
  • 当在成员函数内部使用 this 时,你实际上是在操作调用该函数的具体对象。

 

 

这篇关于类和对象的概述以及this指针的应用的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1146158

相关文章

中文分词jieba库的使用与实景应用(一)

知识星球:https://articles.zsxq.com/id_fxvgc803qmr2.html 目录 一.定义: 精确模式(默认模式): 全模式: 搜索引擎模式: paddle 模式(基于深度学习的分词模式): 二 自定义词典 三.文本解析   调整词出现的频率 四. 关键词提取 A. 基于TF-IDF算法的关键词提取 B. 基于TextRank算法的关键词提取

水位雨量在线监测系统概述及应用介绍

在当今社会,随着科技的飞速发展,各种智能监测系统已成为保障公共安全、促进资源管理和环境保护的重要工具。其中,水位雨量在线监测系统作为自然灾害预警、水资源管理及水利工程运行的关键技术,其重要性不言而喻。 一、水位雨量在线监测系统的基本原理 水位雨量在线监测系统主要由数据采集单元、数据传输网络、数据处理中心及用户终端四大部分构成,形成了一个完整的闭环系统。 数据采集单元:这是系统的“眼睛”,

csu 1446 Problem J Modified LCS (扩展欧几里得算法的简单应用)

这是一道扩展欧几里得算法的简单应用题,这题是在湖南多校训练赛中队友ac的一道题,在比赛之后请教了队友,然后自己把它a掉 这也是自己独自做扩展欧几里得算法的题目 题意:把题意转变下就变成了:求d1*x - d2*y = f2 - f1的解,很明显用exgcd来解 下面介绍一下exgcd的一些知识点:求ax + by = c的解 一、首先求ax + by = gcd(a,b)的解 这个

hdu1394(线段树点更新的应用)

题意:求一个序列经过一定的操作得到的序列的最小逆序数 这题会用到逆序数的一个性质,在0到n-1这些数字组成的乱序排列,将第一个数字A移到最后一位,得到的逆序数为res-a+(n-a-1) 知道上面的知识点后,可以用暴力来解 代码如下: #include<iostream>#include<algorithm>#include<cstring>#include<stack>#in

zoj3820(树的直径的应用)

题意:在一颗树上找两个点,使得所有点到选择与其更近的一个点的距离的最大值最小。 思路:如果是选择一个点的话,那么点就是直径的中点。现在考虑两个点的情况,先求树的直径,再把直径最中间的边去掉,再求剩下的两个子树中直径的中点。 代码如下: #include <stdio.h>#include <string.h>#include <algorithm>#include <map>#

【区块链 + 人才服务】可信教育区块链治理系统 | FISCO BCOS应用案例

伴随着区块链技术的不断完善,其在教育信息化中的应用也在持续发展。利用区块链数据共识、不可篡改的特性, 将与教育相关的数据要素在区块链上进行存证确权,在确保数据可信的前提下,促进教育的公平、透明、开放,为教育教学质量提升赋能,实现教育数据的安全共享、高等教育体系的智慧治理。 可信教育区块链治理系统的顶层治理架构由教育部、高校、企业、学生等多方角色共同参与建设、维护,支撑教育资源共享、教学质量评估、

AI行业应用(不定期更新)

ChatPDF 可以让你上传一个 PDF 文件,然后针对这个 PDF 进行小结和提问。你可以把各种各样你要研究的分析报告交给它,快速获取到想要知道的信息。https://www.chatpdf.com/

Java 创建图形用户界面(GUI)入门指南(Swing库 JFrame 类)概述

概述 基本概念 Java Swing 的架构 Java Swing 是一个为 Java 设计的 GUI 工具包,是 JAVA 基础类的一部分,基于 Java AWT 构建,提供了一系列轻量级、可定制的图形用户界面(GUI)组件。 与 AWT 相比,Swing 提供了许多比 AWT 更好的屏幕显示元素,更加灵活和可定制,具有更好的跨平台性能。 组件和容器 Java Swing 提供了许多

【区块链 + 人才服务】区块链集成开发平台 | FISCO BCOS应用案例

随着区块链技术的快速发展,越来越多的企业开始将其应用于实际业务中。然而,区块链技术的专业性使得其集成开发成为一项挑战。针对此,广东中创智慧科技有限公司基于国产开源联盟链 FISCO BCOS 推出了区块链集成开发平台。该平台基于区块链技术,提供一套全面的区块链开发工具和开发环境,支持开发者快速开发和部署区块链应用。此外,该平台还可以提供一套全面的区块链开发教程和文档,帮助开发者快速上手区块链开发。

【C++高阶】C++类型转换全攻略:深入理解并高效应用

📝个人主页🌹:Eternity._ ⏩收录专栏⏪:C++ “ 登神长阶 ” 🤡往期回顾🤡:C++ 智能指针 🌹🌹期待您的关注 🌹🌹 ❀C++的类型转换 📒1. C语言中的类型转换📚2. C++强制类型转换⛰️static_cast🌞reinterpret_cast⭐const_cast🍁dynamic_cast 📜3. C++强制类型转换的原因📝