我的编程空间,编程开发者的网络收藏夹
学习永远不晚

C++对象模型与this指针怎么使用

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

C++对象模型与this指针怎么使用

这篇“C++对象模型与this指针怎么使用”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“C++对象模型与this指针怎么使用”文章吧。

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

C++认为万事万物都皆为对象,对象上有其属性和行为

例如:

人可以作为对象,属性有姓名、年龄、身高、体重…,行为有走、跑、跳、吃饭、唱歌…

车也可以作为对象,属性有轮胎、方向盘、车灯…,行为有载人、放音乐、放空调…

具有相同性质的对象,我们可以抽象称为类,人属于人类,车属于车类

C++对象模型和this指针

1 成员变量和成员函数分开存储

在C++中,类内的成员变量和成员函数分开存储

  • 空对象占一个字节;

  • c++编译器会给每一个空对象也分配一个字节的空间,是为了区分空对象占内存的位置

  • 每个空对象也应该有一个独一无二的内存地址。

  • 非静态成员变量,属于类的对象上

  • 静态成员变量,不属于类的对象上

  • 非静态成员函数,不属于类的对象上

  • 静态成员函数,不属于类的对象上

  • 非静态成员变量,属于类的对象上,why?

空对象本来占1个字节,在添加非静态成员变量【int】后,占4个字节。

总结:只有非静态成员变量才属于类的对象上。

class Person {public:Person() {mA = 0;}//非静态成员变量占对象空间int mA;//静态成员变量不占对象空间static int mB; //函数也不占对象空间,所有函数共享一个函数实例void func() {cout << "mA:" << this->mA << endl;}//静态成员函数也不占对象空间static void sfunc() {}};int Person::mB=0;int main() {cout << sizeof(Person) << endl;system("pause");return 0;}

2 this指针概念

通过1我们知道在C++中成员变量和成员函数是分开存储的

每一个非静态成员函数只会诞生一份函数实例,也就是说多个同类型的对象会共用一块代码

那么问题是:这一块代码是如何区分那个对象调用自己的呢?

c++通过提供特殊的对象指针,this指针,解决上述问题。this指针指向被调用的成员函数所属的对象

this指针是隐含每一个非静态成员函数内的一种指针。

this指针不需要定义,直接使用即可。

this指针的用途:

  • 当形参和成员变量同名时,可用this指针来区分

  • 在类的非静态成员函数中返回对象本身,可使用return *this

class Person{public:Person(int age){//1、当形参和成员变量同名时,可用this指针来区分//this指针指向被调用的成员函数所属的对象this->age = age;//之前案例中,是:m_Age=age;【m:number】是区分成员属性与传入形参的名称有一个规范}//返回本体用引用的方式Person& PersonAddPerson(Person &p){this->age += p.age;//this指向p2的指针,而*this指向的就是p2这个对象本体return *this;}int age;};void test01(){Person p1(10);cout << "p1.age = " << p1.age << endl;Person p2(10);//链式编程思想p2.PersonAddPerson(p1).PersonAddPerson(p1).PersonAddPerson(p1);cout << "p2.age = " << p2.age << endl;}int main() {test01();system("pause");return 0;}

3 空指针访问成员函数

C++中空指针也是可以调用成员函数的,但是也要注意有没有用到this指针

如果用到this指针,需要加以判断保证代码的健壮性

示例:

//空指针访问成员函数class Person {public:void ShowClassName() {cout << "我是Person类!" << endl;}void ShowPerson() {if (this == NULL) {return;}cout << mAge << endl;}public:int mAge;};void test01(){Person * p = NULL;p->ShowClassName(); //空指针,可以调用成员函数p->ShowPerson();  //但是如果成员函数中用到了this指针,就不可以了}int main() {test01();system("pause");return 0;}

4 const修饰成员函数

常函数:

  • 成员函数后加const后我们称为这个函数为常函数

  • 常函数内不可以修改成员属性

  • 成员属性声明时加关键字mutable后,在常函数中依然可以修改

常对象:

  • 声明对象前加const称该对象为常对象

  • 常对象只能调用常函数

示例:

class Person {public:Person() {m_A = 0;m_B = 0;}//this指针的本质是一个指针常量,指针的指向不可修改,值可以改//如果想让指针指向的值也不可以修改,需要声明常函数void ShowPerson() const {//const Type* const pointer;//this = NULL; //不能修改指针的指向 Person* const this;//this->mA = 100; //但是this指针指向的对象的数据是可以修改的//const修饰成员函数,表示指针指向的内存空间的数据不能修改,除了mutable修饰的变量this->m_B = 100;}void MyFunc() const {//mA = 10000;}public:int m_A;mutable int m_B; //特殊变量,即使在常函数中,也可以修饰这个值,加关键字mutable};//const修饰对象  常对象void test01() {const Person person; //常量对象  cout << person.m_A << endl;//person.mA = 100; //常对象不能修改成员变量的值,但是可以访问person.m_B = 100; //但是常对象可以修改mutable修饰成员变量//常对象访问成员函数person.MyFunc(); //常对象不能调用const的函数}int main() {test01();system("pause");return 0;}

以上就是关于“C++对象模型与this指针怎么使用”这篇文章的内容,相信大家都有了一定的了解,希望小编分享的内容对大家有帮助,若想了解更多相关的知识内容,请关注编程网行业资讯频道。

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

C++对象模型与this指针怎么使用

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

C++对象模型与this指针怎么使用

这篇“C++对象模型与this指针怎么使用”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“C++对象模型与this指针怎么使用
2023-06-30

如何理解C++对象模型和this指针

本篇内容主要讲解“如何理解C++对象模型和this指针”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“如何理解C++对象模型和this指针”吧!对象模型成员变量和成员函数分开存储一、只有非静态成员
2023-06-25

C++函数指针,对象指针,this指针,指向类静态怎么用

这篇文章主要介绍了C++函数指针,对象指针,this指针,指向类静态怎么用的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇C++函数指针,对象指针,this指针,指向类静态怎么用文章都会有所收获,下面我们一起来看
2023-06-29

怎么在C++中使用this指针和空指针

本篇文章为大家展示了怎么在C++中使用this指针和空指针,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。C++通过提供特殊的对象指针,this指针,解决上述问题。this指针指向被调用的成员函数所属
2023-06-14

C++中类的this指针怎么使用

这篇“C++中类的this指针怎么使用”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“C++中类的this指针怎么使用”文章吧
2023-06-29

c++怎么用指针指向string的对象

在C++中,可以通过以下方式使用指针指向string对象:使用指针声明一个指向string对象的指针变量:string str = "Hello";string* ptr = &str; // ptr指向str对象在这个例子中,ptr
2023-10-27

C++内存空间怎么分配与this指针如何使用

本篇内容介绍了“C++内存空间怎么分配与this指针如何使用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!成员属性和函数的存储在C++中成员
2023-06-30

C#中怎么查看对象模型

C#中怎么查看对象模型,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。C#语言有很多值得学习的地方,这里我们主要介绍C#查看Excel对象模型,包括介绍Range对象的Find(
2023-06-17

C++常量与指针怎么用

本文小编为大家详细介绍“C++常量与指针怎么用”,内容详细,步骤清晰,细节处理妥当,希望这篇“C++常量与指针怎么用”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。前言和指针联用有佷微妙的地方,之前一直佷晕,现在来
2023-06-27

C++中指针怎么使用

这篇文章给大家分享的是有关C++中指针怎么使用的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。指针为什么要有类型是为了指针运算和取值。当使用指针取值的时候需要知道怎么取值,比如按照多少个字节去取值,这是需要确定才能
2023-06-29

C++智能指针shared_ptr怎么使用

本篇内容介绍了“C++智能指针shared_ptr怎么使用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!1、什么是shared_ptr?C+
2023-06-29

C++中怎么使用智能指针

这篇文章给大家介绍C++中怎么使用智能指针,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。一、为什么要使用智能指针一句话带过:智能指针就是帮我们C++程序员管理动态分配的内存的,它会帮助我们自动释放new出来的内存,从而
2023-06-20

C语言中怎么使用指针函数和函数指针

本篇内容介绍了“C语言中怎么使用指针函数和函数指针”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!一、指针函数当一个函数声明其返回值为一个指针
2023-06-16

C# Mutex对象怎么使用

本篇内容主要讲解“C# Mutex对象怎么使用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“C# Mutex对象怎么使用”吧!如何控制好多个线程相互之间的联系,不产生冲突和重复,这需要用到互斥对
2023-06-17

C++11智能指针weak_ptr怎么使用

本篇内容主要讲解“C++11智能指针weak_ptr怎么使用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“C++11智能指针weak_ptr怎么使用”吧!弱指针weak_ptr看起来更像shar
2023-06-19

C语言中的指针怎么使用

这篇文章主要介绍“C语言中的指针怎么使用”,在日常操作中,相信很多人在C语言中的指针怎么使用问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”C语言中的指针怎么使用”的疑惑有所帮助!接下来,请跟着小编一起来学习吧
2023-06-17

C++普通函数指针怎么使用

本篇内容介绍了“C++普通函数指针怎么使用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!进行C++编写程序时,你经常需要在一个函数中调用其他
2023-06-17

C++11智能指针shared_ptr怎么使用

本篇内容介绍了“C++11智能指针shared_ptr怎么使用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!shared_prt的本身是一个
2023-06-19

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录