文章详情

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

请输入下面的图形验证码

提交验证

短信预约提醒成功

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

2023-06-30 17:05

关注

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

成员属性和函数的存储

在C++中成员变量和成员函数是分开存储的;

空对象

class Person {};

这里我直接创建一个空的类,并创建一个空的类对象(Person p),利用sizeof关键字输出p所占内存空间,sizeof(p);结果是p=1;

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

注意:空对象占用内存空间为:

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

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

成员属性的存储

class Person{public:int m_A;    static int m_B;};int Person::m_B = 100;

首先创建一个简单的Person类,仅仅包含普通成员属性m_A和静态成员变量m_B;然后直接利用sizeof关键字输出p所占内存空间:sizeof(p)

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

这里的结果是4,而不是8,这是因为静态成员属性不属于类的对象上,无论再加几个静态成员属性,都不会改变结果是4,但是一旦普通成员属性,就会多占用内存空间,比如我加一个float类型的m_c属性,结果是:

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

成员函数的存储

class Person{public:void func1(){}static void func2(){}//函数都不属于类的对象上,只有非静态成员变量才占用类对象内存空间.};

这里的Person类中加了普通成员函数和静态成员函数,他们所占内存空间的情况是什么呢,让我们看看结果:

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

为什么结果和空对象一样呢,因为我开头就说了,C++中成员变量和成员函数是分开存储的,无论是怎样的成员函数都不会占用类对象的内存空间。

小结:函数都不属于类的对象上,只有非静态成员变量才占用类对象内存空间.

this指针的概念

从上面的内容我们知道C++中成员变量和成员函数是分开存储的,每一非静态成员函数只会诞生一份函数实例,也就是说,多个同类型的对象会公用一块代码。

那么问题是:这一块代码是如何区分哪个对象调用自己呢?C++通过特殊的对象指针,this指针解决上述问题。this指针指向被调用的成员函数所属的对象。 this指针是隐含每一个非静态成员函数内的一个指针,不需要定义,直接使用即可。

作用:

解决名称冲突

返回对象指针*this

解决名称冲突

class Person{public:Person(int age){//this 指针指向 被调用的成员函数 所属的对象this->age = age;}int age;};

如果我们在编写代码的时候,写的属性太多了,导致成员属性和要传入的变量名相同,就会引发不必要的bug;这时候加上一个this,就可以完美的解决这个问题,this->+属性名,表示指向被调用的成员函数所属的对象,那样我们这个有参构造函数的赋值问题就很好的解决了。

返回对象指针*this

class Person{public:Person(int age){this->age = age;}Person(const Person& p){cout << "拷贝构造函数调用" << endl;cout << &p << endl;}Person& PersonAddAge(Person &p);int age;};Person& Person::PersonAddAge(Person &p)//返回引用形式地址不变,可以一直加年龄{this->age += p.age;cout << &*this << endl;return *this;}

既然this指针指向这个对象的地址,那么*this就代表这个对象的本身,我们做一个年龄相加的成员方法来测试一下;

void test02(){Person p1(10);Person p2(10);//p1.PersonAddAge(p2).PersonAddAge(p2);//链式调用,返回不加&结果都是20,调用拷贝构造;p1.PersonAddAge(p2).PersonAddAge(p2).PersonAddAge(p1).PersonAddAge(p1);cout << "p1 年龄为:" << p1.age;}

大家可以猜猜这样输出的p1的年龄是多少,正确答案是120,其中的“.+函数”属于链式调用,可以快速调用函数,非常之方便好用。之所以是120,原因是这四次调用中,第一次返回p1的年龄属性为10+10,第二次为20+10,第三次为30+30,第四次为60+60=120。是不是看着很简单,但有一个特别注意的事情;相信有心的伙伴已经看到PersonAddAge函数返回值类型是Person &,返回的是类的引用,为什么不返回类的值呢?

这里注意,如果去掉“&”直接返回类的值的话,是没法继续链式调用的,因为前面讲过返回类型为类对象时,这个返回的类对象会被清理掉,然后调用拷贝构造函数在新的地址创建一个类对象,虽然属性结果一样,但是地址变了,可以输出地址看看:

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

由此可见,去掉“&”四次调用产生了四个地址,而无论多用多少次增加年龄函数,最终结果也只能是20,因为我们输出的是p1的值,从第二次调用,都和p1没关系了,地址已经变了。

再和返回引用的做一下对比:

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

显而易见,返回类引用不会调用构造函数,p1的地址不变,就能成功的累加年龄了!!!

“C++内存空间怎么分配与this指针如何使用”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注编程网网站,小编将为大家输出更多高质量的实用文章!

阅读原文内容投诉

免责声明:

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

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

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     801人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     348人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     311人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     432人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     220人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯