C++ this 指针

 

This 指针:this 是C++中的一个关键字,也是一个常量指针,指向当前对象(具体说是当前对象的首地址) 。通过 this,可以访问当前对象的成员变量和成员函数 。

 

Student  Stu ; //通过Student类创建对象 Stu

Student *pStu =&pStu ;

假设this 指向对象 Stu , 则this 的值和 &pStu 相同 。

 

eg 1: 通过 this 指针来访问 Student 类的成员变量和成员函数:

   class Student{

private:

    char *name;

    int age;

    float score;

public:

    void setName(char *name);

    void setAge(int age);

    void setScore(float score);

};

 

void Student::setName(char *name){

    this->name = name;

}

 

void Student::setAge(int age){

    this->age = age;

}

 

void Student::setScore(float score){

    this->score = score;

}

本例通过this 访问对象 Stu 的成员变量,而没有this的是函数内部的局部变量,所以在本例中函数参数和成员变量可以重名。即:this->score = score;

eg2 :

#include <iostream>

#include <stdlib.h>

using namespace std;

class Student{

private:

    char *name;

    int age;

    float score;

public:

    void setName(char *name);

    void setAge(int age);

    void setScore(float score);

    void printStudent();

};

void Student::setName(char *name){

    this->name = name;

}

void Student::setAge(int age){

    this->age = age;

}

void Student::setScore(float score){

    this->score = score;

}

voidStudent::printStudent(){

    cout<<this->name<<"的年龄是 "<<this->age<<",成绩是 "<<this->score<<endl;

}

int main(){

    Student stu1;

    stu1.setName("张三");

    stu1.setAge(15);

    stu1.setScore(90.5f);

    stu1.printStudent();

  

    Student stu2;

    stu2.setName("李四");

    stu2.setAge(16);

    stu2.setScore(80);

    stu2.printStudent();

 

   system("pause");

    return 0;

}

运行结果;

 

对象和普通变量类似;每个对象都占用若干字节的内存,用来保存成员变量的值,不同对象占用的内存互不重叠,所以操作对象A不会影响对象B。

上例中,创建对象 stu1 时,this 指针就指向了 stu1 所在内存的首字节,它的值和 &stu1 是相同的;创建对象 stu2 时,this 等于 &stu2;创建对象 stu3 时也一样

 

在main 函数中创建两个新对象Stu1 和 Stu2

   Student stu1;

   Student *pStu1 = &stu1;

   stu1.printThis();

   cout<<pStu1<<endl;

 

   Student stu2;

   Student *pStu2 = &stu2;

   stu2.printThis();

   cout<<pStu2<<endl;

 

运行结果:


 

显然this 指针指向了当前对象的首地址,访问不同的对象,this的指向不同。

 

 

this的作用:

    一种情况就是,在类的非静态成员函数中返回类对象本身的时候,直接使用 return *this;。

一个对象的this指针并不是对象本身的一部分,不会影响sizeof(对象)的结果。this作用域是在类内部,当在类的非静态成员函数中访问类的非静态成员的时候,编译器会自动将对象本身的地址作为一个隐含参数传递给函数。

 

this 的实质:

 

    实际上,this 指针是作为函数的参数隐式传递的,它并不出现在参数列表中,调用成员函数时,系统自动获取当前对象的地址,赋值给 this,完成参数的传递,无需用户干预。

 

this 作为隐式参数,本质上是成员函数的局部变量,不占用对象的内存,只有在发生成员函数调用时才会给 this 赋值,函数调用结束后,this 被销毁。

 

因为 this 是参数,表示对象首地址,所以只能在函数内部使用,并且对象被实例化以后才有意义。

this是成员函数和成员变量关联的桥梁。

 

注:

(1)this 是常量指针,它的值是不能被修改的,一切企图修改该指针的操作,如赋值、递增、递减等都是不允许的。

(2)this 只能在成员函数内部使用,其他地方没有意义,也是非法的,。

(3)只有当对象被创建后 this 才有意义

(4)this在成员函数的开始执行前构造,在成员的执行结束后清除。

(5)this指针会因编译器不同而有不同的放置位置。可能是栈,也可能是寄存器,甚至全局变量。

 

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

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

相关文章

css3 loading 效果1

代码&#xff1a; <!doctype html> <html lang"en"> <head> <meta charset"UTF-8"> <title>Document</title> <style> #box{position: relative;margin: 100px;} #box span{display: block;width: 9px;height: …

计算几何 - XOJ 1171 线段求交

问题 Description 线段求交即给定一组线段求出这些线段的相交情况&#xff0c;它是计算几何的基础问题之一,有着广泛的应用. Input第一行为一个正整数n表示线段的个数&#xff08;n<10000&#xff09;第二行到第n1行每行包括4个正整数x1,y1,x2,y2, (0 < x1,y1,x2,y2 <…

类成员函数解析

1、 构造函数&#xff1a; &#xff08;1&#xff09; 定义&#xff1a;是一个特殊的成员函数&#xff0c;名字与类名相同&#xff0c;创建类类型对象时&#xff0c;由编译器自动调用&#xff0c;在对象的生命周期内只且只调用一次&#xff0c;以保证每个数据成员都有一…

微信开发学习日记(六):weiphp框架

最近重点在看weiphp这个开源的第三方微信公众平台框架。在网上找微信资料&#xff0c;找到了这个。很早之前&#xff0c;就初步学习了Thinkphp和Onethink2个开源框架&#xff0c;当看到weiphp是用这2个框架开发的时候&#xff0c;我就更愿意去学习&#xff0c;毕竟学习成本很低…

SVN常用命令备注

1、将文件checkout到本地目录 svn checkout path&#xff08;path是服务器上的目录&#xff09; 例如&#xff1a;svn checkout svn://192.168.1.1/pro/domain 简写&#xff1a;svn co 2、往版本库中添加新的文件 svn add file 例如&#xff1a;svn add test.php(添加test.php)…

add-apt-repository cloud-archive:liberty

apt-get update && apt-get upgrade; v

日期类Date

#include <iostream>using namespace std;//日期是否合法//日期比较//两个日期中间差的天数//日期加上或减去一定的天数后的日期class Date{friend ostream& operator<<(ostream& _cout, const Date& d);friend istream& operator>>(istream…

Linux下编译安装Apache httpd 2.4

Apache是世界使用排名第一的Web服务器软件。它可以运行在几乎所有广泛使用的计算机平台上&#xff0c;由于其跨平台和安全性被广泛使用&#xff0c;是最流行的Web服务器端软件之一。当前Apache版本为2.4&#xff0c;本文主要描述基于CentOS 6.5以源码方式安装Apache httpd。 一…

选取硬币问题

有1元&#xff0c;5元&#xff0c;10元&#xff0c;50元&#xff0c;100元&#xff0c;500元的硬币各c0,c1,c2,c3,c4, c5枚 现在要使用这些硬币支付n元&#xff0c;问最少需要多少枚硬币&#xff0c;假设至少存在一种方案。 应该尽可能使用500元的&#xff0c;然后再使用100元的…

SAP OBYC自动记账的实例说明 +VALUE STRING

对Value String定义&#xff1a;定义了一系列的步骤优先顺序&#xff0c;每一个步骤都连接到不同的过账事务码&#xff0c;而这个顺序本身就称作价值串。价值串你可以看作是一种记账的规则&#xff0c;为物料移动或者发票校验包含了一系列的科目分配特征。并且物料移动的科目确…

C++ 继承解析

继承 1、概念&#xff1a; 继承(inheritance)机制是面向对象程序设计使代码可以复用的最重要的手段&#xff0c;它允许程序员在保持原有类特性的基础上进行扩展&#xff0c;增加功能。这样产生新的类&#xff0c;称派生类。继承呈现了面向对象程序设计的层次结构&#xff0c;体…

javascript window.open

翻译原文&#xff1a;open methodOpens a new window and loads the document specified by a given URL.Navigates the app window to the specified location.Syntaxvar retval window.open(url, name, features, replace);Parametersurl [in, optional] Type: String …

[傅里叶变换及其应用学习笔记] 九. 继续卷积的讨论

这份是本人的学习笔记&#xff0c;课程为网易公开课上的斯坦福大学公开课&#xff1a;傅里叶变换及其应用。 卷积在滤波中的应用 浑浊度&#xff08;Turbidity&#xff09;研究是关于测量水的清澈度的研究。大致方法是把光传感器放置到深水区域&#xff0c;然后测量光线的昏暗程…

C++多态相关关问题及虚表剖析

关于C多态的问题&#xff1a;&#xff08;基于Visual Studio 2012编译器&#xff09; 一、多态引入 1、对象的类型&#xff1a; &#xff08;1&#xff09; 静态的类型&#xff1a;对象声明时的类型&#xff0c;在编译的时候确定 &#xff08;2&#xff09; 动态的类型&…

C++调用约定

<div class"markdown_views"><p>有一定C开发经验的人一定对”__cdecl、__stdcall、__fastcall”肯定不陌生吧&#xff01;但你真正理解了吗&#xff1f;是的&#xff0c;我曾在这采了无数个坑&#xff0c;栽了无数个跟头&#xff0c;终于忍无可忍要把它总…

CSS中的特殊的选择器

/*表示div盒子中的P标签*/ div P{} /*表示div盒子中除第一个P之外的都要添加样式*/ div pp{} /*表示div盒子中从第三个p开始都要添加样式*/转载于:https://www.cnblogs.com/Dream-Seeker/p/4454325.html

添加文字和水印

1.加文字-(UIImage *)addText:(UIImage *)img text:(NSString *)text1{//get image width and heightint w img.size.width;int h img.size.height;CGColorSpaceRef colorSpace CGColorSpaceCreateDeviceRGB();//create a graphic context with CGBitmapContextCreateCGCont…

C++动态绑定及返回类型协变

C多态之动态绑定&#xff1a; 1、概念&#xff1a;在程序执行期间(非编译期)判断所引用对象的实际类型&#xff0c;根据其实际类型调用相应的方法。 使用virtual关键字修饰类的成员函数时&#xff0c;指明该函数为虚函数&#xff0c;派生类需要重新实现&#xff0c;编译器将实…

使用ucontext组件实现的coroutine代码分析

coroutine一般翻译过来就是协程&#xff0c;类似于线程可以切换&#xff0c;而跟线程是由操作系统调度器来实现切换不一样&#xff0c;协程由用户程序自己调度进行切换。我以前也看过协程相关的内容&#xff0c;但没有自己去实现过。最近搞OpenStack&#xff0c;OpenStack各个模…

C++模板剖析:函数模板、类模板解析

C中关于模板&泛型编程问题&#xff1a; 问题引入&#xff1a;何编写一个通用加法函数&#xff1f; &#xff08;1&#xff09;使用函数重载&#xff0c;针对每个所需相同行为的不同类型重新实现它 int Add(const int &_iLeft, const int&_iRight) { return (_iL…