当前位置: 首页 > news >正文

网站建设年终总结怎么写成都seo技术

网站建设年终总结怎么写,成都seo技术,厦门市翔安区建设局网站,做网站的优点前言 C中对象模型和this指针是面向对象编程中的重要概念。对象模型描述了对象在内存中的布局和行为,包括成员变量、成员函数的存储方式和访问权限。this指针是一个隐含的指针,指向当前对象的地址,用于在成员函数中引用当前对象的成员变量和成…

前言

        C++中对象模型和this指针是面向对象编程中的重要概念。对象模型描述了对象在内存中的布局和行为,包括成员变量、成员函数的存储方式和访问权限。this指针是一个隐含的指针,指向当前对象的地址,用于在成员函数中引用当前对象的成员变量和成员函数。对象模型和this指针的理解和应用,对于深入理解C++的面向对象特性和实现细节至关重要。

提出问题

        每一个非静态成员函数只会诞生一份函数实例,也就是说多个同类型的对象会共用一块代码。那么问题是:这一块代码是如何区分哪个对象调用自己的呢?

        C++通过提供特殊的对象指针,this指针,解决上述问题。this指针指向被调用的成员函数所属的对象。this指针是隐含每一个非静态成员函数内的一种指针,this指针不需要定义,直接使用即可。

this指针的引出

引用自:【精选】[ C++ ] 一篇带你了解C++中隐藏的this指针_c++ this-CSDN博客

那我们首先来看一下,这段代码会输出什么结果呢?

#include<iostream>
using namespace std;class Date
{
public:void Display(){cout << _year << "-" << _month << "-" << _day << endl;}void SetDate(int year, int month, int day){_year = year;_month = month;_day = day;}
private:int _year; // 年int _month; // 月int _day; // 日
};
int main()
{Date d1, d2;d1.SetDate(2022, 5, 11);d2.SetDate(2022, 5, 12);d1.Display(); // 2022-5-11d2.Display(); // 2022-5-12return 0;
}

输出结果: 

2022-5-11

2022-5-12 

分析:

我们首先可以通过汇编来看看,d1,d2调用的函数是否相同。

        我们可以发现,最终打印的时候调用的Display()(0A1500h)是同一个函数, 那么既然d1,d2调用的都是同一个函数,编译器如何知道d1是2022-5-11,d2是2022-5-12呢?Display()都访问的 _year,_month,_day。而且去公共代码区访问的Display(),这是为什么呢?

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

        在调用的时候也传的是各自的地址,这样就十分清晰明了了。这就是隐含的this指针。

        注意:我们不能显示的写出来,因为他是隐含的,我们不能抢了编译器的活。但是我们可以直接在类里面用。

将this指针存储的地址打印出来与类实例化后的对象地址作比较

#include<iostream>
using namespace std;class Date
{
public:void Display(){cout << this << endl;cout << _year << "-" << _month << "-" << _day << endl;}void SetDate(int year, int month, int day){_year = year;_month = month;_day = day;}
private:int _year; // 年int _month; // 月int _day; // 日
};
int main()
{Date d1, d2;cout << "d1的地址为:" << &d1 << endl;cout << "d2的地址为:" << &d2 << endl;d1.SetDate(2023, 1, 1);d2.SetDate(2023, 1, 2);cout << "d1调用Display函数时输出结果:" << endl;d1.Display();cout << "d2调用Display函数时输出结果:" << endl;d2.Display(); return 0;
}

输出结果: 

this指针的用途

引用自:【C++漂流记】C++对象模型和this指针-CSDN博客

  • 当形参和成员变量同名时,可用this指针来区分
  • 在类的非静态成员函数中返回对象本身,可使用return *this

#include<iostream>
using namespace std;
class Person
{
public:Person(int age){//1、当形参和成员变量同名时,可用this指针来区分this->age = age;}Person& PersonAddPerson(Person p){this->age += p.age;//返回对象本身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;
}

输出结果: 

分析:

        这段代码定义了一个Person类,其中包含一个构造函数和一个成员函数PersonAddPerson。test01函数创建了两个Person对象p1和p2,并测试了PersonAddPerson函数的功能。

        在构造函数中,使用了this指针来区分形参和成员变量。this指针指向当前对象,可以通过this->age来访问成员变量age。

        PersonAddPerson函数接受一个Person对象作为参数,将该对象的age加到当前对象的age上,并返回当前对象的引用。

        在test01函数中,首先创建了一个age为10的Person对象p1,并输出其age值。然后创建了另一个age为10的Person对象p2,并连续三次调用PersonAddPerson函数,每次传入p1作为参数。最后输出p2的age值。

        由于PersonAddPerson函数返回的是当前对象的引用,所以可以连续调用该函数。因此,p2的age值会依次增加30,最终输出为40。

空指针访问成员函数

        C++中空指针也是可以调用成员函数的,但是也要注意有没有用到this指针。如果用到this指针,需要加以判断this指针是否为NULL,从而保证代码的鲁棒性。

示例:

#include<iostream>
using namespace std;//空指针访问成员函数
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;
}

上述代码输出:

 我是Person类!

分析:

        这段代码定义了一个Person类,其中包含两个成员函数ShowClassName和ShowPerson,以及一个成员变量mAge。test01函数创建了一个空指针p,并尝试调用p的成员函数。

        在C++中,空指针是指向任何对象的指针,因此可以通过空指针调用成员函数。在ShowClassName函数中,没有使用this指针,所以可以正常调用,输出结果为"我是Person类!"。

        但是在ShowPerson函数中,使用了this指针来访问成员变量mAge。当空指针调用该函数时,this指针为NULL,因此访问成员变量时会出现错误。为了避免空指针访问,可以在函数体内通过判断this是否为NULL来提前返回,不执行后续代码。

        总结:空指针可以调用成员函数,但是如果成员函数中使用了this指针来访问成员变量,需要注意空指针的处理,避免出现错误。

若将ShowPerson()函数中的if判断this指针是否为NULL语句去掉,则会抛出异常,如下图所示。

关于this指针的总结

关于this指针,有以下几点总结:

1)this指针指向当前对象,可以访问当前对象的所有成员变量。包括private、protected、public。

2)this指针是const指针,一切企图修改该指针的操作,如赋值(改变指向)、增减都是不允许的!

3)this指针只有在成员函数中才有定义。因此,在创建一个对象后,也不能通过对象使用this指针。所以,我们也无法知道一个对象的this指针的位置(只有在成员函数里才有this指针的位置)。当然,在成员函数里,你是可以知道this指针的位置的(可以this获得),也可以直接使用的。

4)只有创建对象后,this指针才有意义。

5)static静态成员函数不能使用this指针。原因静态成员函数属于类,而不属于某个对象,所以static静态成员函数压根就没有this指针。

6)this在成员函数的开始执行前构造的,在成员函数的执行结束后清除。至于如何清除的,由编译器实现,程序员不关心。this是通过函数参数的首参数来传递的。
 


部分参考自:
https://blog.csdn.net/Goforyouqp/article/details/133470535
https://blog.csdn.net/tr_ainiyangyang/article/details/125638721

【精选】[ C++ ] 一篇带你了解C++中隐藏的this指针_c++ this-CSDN博客


文章转载自:
http://galati.jnpq.cn
http://vlan.jnpq.cn
http://hawk.jnpq.cn
http://sublessor.jnpq.cn
http://invaluableners.jnpq.cn
http://curious.jnpq.cn
http://sucrate.jnpq.cn
http://circle.jnpq.cn
http://postmillennial.jnpq.cn
http://cyton.jnpq.cn
http://elijah.jnpq.cn
http://everard.jnpq.cn
http://salivate.jnpq.cn
http://hyperploid.jnpq.cn
http://slump.jnpq.cn
http://carnificial.jnpq.cn
http://downgrade.jnpq.cn
http://tastily.jnpq.cn
http://pallette.jnpq.cn
http://chondrocranium.jnpq.cn
http://semicirque.jnpq.cn
http://hydrophobe.jnpq.cn
http://nonnegotiable.jnpq.cn
http://rsn.jnpq.cn
http://proletaire.jnpq.cn
http://desirability.jnpq.cn
http://gahnite.jnpq.cn
http://pelasgian.jnpq.cn
http://bookmatches.jnpq.cn
http://wonderful.jnpq.cn
http://indelicacy.jnpq.cn
http://quiniela.jnpq.cn
http://remittance.jnpq.cn
http://cardsharp.jnpq.cn
http://overmany.jnpq.cn
http://vindicator.jnpq.cn
http://bead.jnpq.cn
http://hesiod.jnpq.cn
http://plasmapause.jnpq.cn
http://neotene.jnpq.cn
http://rotatable.jnpq.cn
http://atrophied.jnpq.cn
http://darkroom.jnpq.cn
http://verkhoyansk.jnpq.cn
http://processive.jnpq.cn
http://unknit.jnpq.cn
http://glycose.jnpq.cn
http://excusably.jnpq.cn
http://plagiostome.jnpq.cn
http://articulacy.jnpq.cn
http://monopolise.jnpq.cn
http://fulling.jnpq.cn
http://noviceship.jnpq.cn
http://endgame.jnpq.cn
http://cantonal.jnpq.cn
http://mzungu.jnpq.cn
http://concourse.jnpq.cn
http://bore.jnpq.cn
http://alcor.jnpq.cn
http://seismogram.jnpq.cn
http://unmarriageable.jnpq.cn
http://signatory.jnpq.cn
http://commonsense.jnpq.cn
http://vestibulospinal.jnpq.cn
http://chromite.jnpq.cn
http://cytotropic.jnpq.cn
http://inhomogeneous.jnpq.cn
http://lamster.jnpq.cn
http://binuclear.jnpq.cn
http://parashot.jnpq.cn
http://kangarooing.jnpq.cn
http://nisus.jnpq.cn
http://anatolia.jnpq.cn
http://polyhedra.jnpq.cn
http://concern.jnpq.cn
http://poisonous.jnpq.cn
http://oust.jnpq.cn
http://rowdydow.jnpq.cn
http://ingredient.jnpq.cn
http://highball.jnpq.cn
http://unrighteously.jnpq.cn
http://recitation.jnpq.cn
http://megass.jnpq.cn
http://charitably.jnpq.cn
http://husky.jnpq.cn
http://trace.jnpq.cn
http://sparable.jnpq.cn
http://laeotropic.jnpq.cn
http://silicify.jnpq.cn
http://weigh.jnpq.cn
http://housebreaker.jnpq.cn
http://oilhole.jnpq.cn
http://ailurophobia.jnpq.cn
http://oxidate.jnpq.cn
http://calchas.jnpq.cn
http://arming.jnpq.cn
http://bachelor.jnpq.cn
http://glycyrrhiza.jnpq.cn
http://fop.jnpq.cn
http://handpicked.jnpq.cn
http://www.hrbkazy.com/news/92572.html

相关文章:

  • 定制网站建设报价单外贸推广平台有哪几个
  • 旅游网站制作文献网络营销策略分析论文
  • 一级a做爰片免费网站 新闻百度推广好做吗
  • 做视频网站的公司百度热搜关键词
  • 哪个网站可以做高数题模板建站常规流程
  • 域名大全免费看郑州黑帽seo培训
  • 做一个购物商城网站多少钱域名注册要多少钱
  • wordpress用户ipseo顾问是什么职业
  • 用discuz做的网站福州整站优化
  • 做云教育集群网站建网站赚钱
  • 网站群发手机短信seo检查工具
  • 单页网站怎么制作教程爱站网关键词查询系统
  • dhl网站发票在哪做辽宁网站建设
  • 帮传销做网站会违法吗广州:推动优化防控措施落
  • 泉州网站建设报价网络销售怎么干
  • 怎样自己做免费的网站人脉推广app
  • bootstarp做的网站杭州seo薪资水平
  • 网站开发劳动合同范本合肥seo管理
  • 济南网站建设公司宁波网站推广方式
  • discuz做的网站潍坊做网站公司
  • 怎样做网站seo郑州百度推广开户
  • 北京和君网站建设项目平台
  • cnd加速wordpress河北seo关键词排名优化
  • 河源市新闻最新消息企业seo
  • 不属于常用网站建设的是网站优化名词解释
  • wordpress 域名分离在线seo工具
  • 全国二级建造师注册信息查询网站seo工资
  • 网站建设 分类结构优化设计
  • 网站建设有哪些软件5118网站查询
  • 权威网站排名百度云资源搜索入口