首页 > 其他分享 >this指针

this指针

时间:2023-11-07 23:05:10浏览次数:33  
标签:const 函数 对象 成员 Person 指针

1、this指针指向被调用成员函数所属的对象。

当一个对象被创建后,它的每一个成员函数都含有一个系统自动生成的隐含指针 this,用以保存这个对象的地址,也就是说虽然我们没有写上 this 指针,编译器在编译的时候也是会加上的。This 指针无需定义,直接使用即可。

因此 this 也称为“指向本对象的指针”,this 指针并不是对象的一部分,不会影响 sizeof(对象)的结果。 

this 指针是 C++实现封装的一种机制,它将对象和该对象调用的成员函数连接在一起,在外部看来,每一个对象都拥有自己的函数成员。

注意:

静态成员函数内部没有 this 指针,静态成员函数不能操作非静态成员变量。

this 指针永远指向当前对象。

2、this 指针的使用

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

 

class Person{
public:
    //1. 当形参名和成员变量名一样时,this 指针可用来区分
    Person(string name,int age){
        //name = name;
        //age = age; //输出错误
        this->name = name;
        this->age = age;
    }
    //2. 返回对象本身的引用
    //重载赋值操作符
    //其实也是两个参数,其中隐藏了一个 this 指针
    Person PersonPlusPerson(Person& person){
        string newname = this->name + person.name;
        int newage = this->age + person.age;
        Person newperson(newname, newage);
        return newperson;
    }
void ShowPerson(){
    cout << "Name:" << name << " Age:" << age << endl;
    }
public:
    string name;
    int age;
};
//3. 成员函数和全局函数(Perosn 对象相加)
Person PersonPlusPerson(Person& p1,Person& p2){
    string newname = p1.name + p2.name;
    int newage = p1.age + p2.age;
    Person newperson(newname,newage);
    return newperson;
}
int main(){
    Person person("John",100);
    person.ShowPerson();
    cout << "---------" << endl;
    Person person1("John",20);
    Person person2("001", 10);
    //1.全局函数实现两个对象相加
    Person person3 = PersonPlusPerson(person1, person2);
    person1.ShowPerson();
    person2.ShowPerson();
    person3.ShowPerson();
    //2. 成员函数实现两个对象相加
    Person person4 = person1.PersonPlusPerson(person2);
    person4.ShowPerson();
    system("pause");
    return EXIT_SUCCESS;
}

 

 const 修饰成员函数

用 const 修饰的成员函数时,const 修饰 this 指针指向的内存区域,成员函数体内不可以修改本类中的任何普通成员变量, 当成员变量类型符前用 mutable 修饰时例外。

    //const 修饰成员函数
class Person{
    public:
    Person(){
    this->mAge = 0;
    this->mID = 0;
}
    //在函数括号后面加上 const,修饰成员变量不可修改,除了 mutable 变量
void sonmeOperate() const{
    //this->mAge = 200; //mAge 不可修改
    this->mID = 10;
}
    void ShowPerson(){
        cout << "ID:" << mID << " mAge:" << mAge << endl;
}
    private:
    int mAge;
    mutable int mID;
};
int main(){
    Person person;
    person.sonmeOperate();
    person.ShowPerson();
    system("pause");
    return EXIT_SUCCESS;
}

const 修饰对象(常对象) 常对象只能调用 const 的成员函数 常对象可访问const 或非 const 数据成员,不能修改,除非成员用 mutable 修饰 

class Person{
public:
    Person(){
    this->mAge = 0;
    this->mID = 0;
}
void ChangePerson() const{
    mAge = 100;
    mID = 100;
}
void ShowPerson(){
    this->mAge = 1000;
    cout << "ID:" << this->mID << " Age:" << this->mAge << endl;
}
public:
    int mAge;
    mutable int mID;
};
void test(){
    const Person person;
    //1. 可访问数据成员
    cout << "Age:" << person.mAge << endl;
    //person.mAge = 300; //不可修改
    person.mID = 1001; //但是可以修改 mutable 修饰的成员变量
    //2. 只能访问 const 修饰的函数
    //person.ShowPerson();
    person.ChangePerson();
}

 

标签:const,函数,对象,成员,Person,指针
From: https://www.cnblogs.com/zznic/p/17816266.html

相关文章

  • Vue源码学习(十五):diff算法(二)交叉比对(双指针)
    好家伙, 本节来解决我们上一章留下来的问题,新旧节点同时有儿子的情况本章继续解决 1.要做什么?本章将解决,1.在相同tag下子元素的替换问题2.使用双指针进行元素替换,实现效果如下: letvm1=newVue({data:{name:'张三'}})letrender1=compileToFunc......
  • 【C语言基础】 指针变量-printf %d和%p的含义
    1.指针变量的值是地址,地址通常用16进制表示2.inta=1;int*p=&a;printf("%d\n",p);和printf("%p\n",p);有什么区别呢,输出的都是p的值,%p是把指针变量p中存储的a的地址以十六进制形式输出,%d是吧p中存储的a的地址以十进制形式输出。输出的都是p的值,不要理解成%p,是把p的地址输出。......
  • sizeof结构体数组指针和sizeof数组指针的区别
    请思考一下以下代码输出的sizeof分别是多少?#include<stdio.h>typedefstruct{charname[100];unsignedcharage;}student_t,*student_ptr;intmain(intargc,char*argv[]){student_tstu={0};student_ptrpStu=&stu;charname[100]={0};......
  • C语言结构体指针
    C语言结构体指针当一个指针变量指向结构体时,称它为结构体指针。C语言结构体指针的定义形式一般为:struct结构体名*变量名;下面是一个定义结构体指针的实例://结构体structstu{char*name;//姓名intnum;//学号intage;//年龄chargroup;//所在小组floatscor......
  • cf1322BPresent(基数排序+双指针+拆位)
    cf1322BPresent首先拆位是显然的,对于两个数a[i],a[j],除了考虑当前位上的数,我们还要考虑是否会产生进位,我们可以利用基数排序+双指针,因为我们每次都是将低位的排好序了,所以我们可以用双指针计算进位,然后分类计算一下,当前为为1的情况即可。#include<cstdio>#include<algorithm>#......
  • 实验三 类与指针、数组
    1#pragmaonce2#include<iostream>34usingstd::cout;56usingstd::endl;78classPoint{910public:11Point(intx0=0,inty0=0);12~Point()=default;13intget_x()const;14intget_y()const;15vo......
  • 实验三:类与数组、指针。
    实验任务11#pragmaonce23#include<iostream>4usingstd::cout;5usingstd::endl;67classPoint{8public:9Point(intx0=0,inty0=0);10~Point()=default;1112intget_x()const;13intget_y()const;14......
  • std::sort 传入成员函数指针报错的解决方案
    问题引入有一个类A,A的某个成员函数需要对A的某些变量进行std::sort,同时要调用A的另一个成员函数作为比较器。如代码所示:structA{vector<int>pos={0,4,2,5,3};boolcmp(intx,inty){returnpos[x]<pos[y];}voiddemo(){vector<int>a={2......
  • 力扣905 按奇偶排序数组 C++ 双指针+一次遍历
    905.按奇偶排序数组classSolution{public:vector<int>sortArrayByParity(vector<int>&nums){inti=0,j=nums.size()-1;while(i<nums.size()-1&&i<j){while(i<j&&(nums[i]%2==0))i++;......
  • C++_14_常量指针—this指针 - 重写版
    常量指针—this指针this指针:成员函数一般都会拥有一个常量指针(this),指向调用函数的对象,储存的是改对象的首地址(注意:静态成员函数是没有this指针的)//标准写法classbook{public:book(){this->price=0.0;this->title=NULL;}private:doubleprice;char......