this指针的使用

c++提供特殊的对象指针,也就是this指针,this指针指向被调用的成员函数所属的对象

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

this函数不需要定义,直接使用即可

 

this指针的用途:

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

 

实例代码1:

#include <iostream>

using namespace std;

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

    int age;

    void PersonAddAge(Person &p) {
        this->age += p.age;
    }

};

void test01() {
    Person p1(10);
    //结果:p1的年龄为:10
    cout << "p1的年龄为:" << p1.age << endl;
}

void test02() {
    Person p1(10);
    Person p2(10);
    p2.PersonAddAge(p1);
    //结果:p2的年龄为:20
    cout << "p2的年龄为:" << p2.age << endl;
}

int main() {
    test01();
    test02();
}

 

当返回值为*this时,函数返回当前对象的引用:

实例代码2:

#include <iostream>

using namespace std;

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

    int age;

    //函数返回当前对象的引用
    Person &PersonAddAge(Person &p) {
        this->age += p.age;
        return *this;
    }

};

void test01() {
    Person p1(11);
    //结果:p1的年龄为:11
    cout << "p1的年龄为:" << p1.age << endl;
}

void test02() {
    Person p1(11);
    Person p2(11);
    //链式编程思想
    p2.PersonAddAge(p1).PersonAddAge(p1).PersonAddAge(p1).PersonAddAge(p1);
    //结果:p2的年龄为:55
    cout << "p2的年龄为:" << p2.age << endl;
}

int main() {
    test01();
    test02();
}

 

当函数返回的不是引用而是值:

实例代码3:

#include <iostream>

using namespace std;

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

    int age;

    //函数的返回类型为类的类型,而返回当前对象的引用
    Person PersonAddAge(Person &p) {
        this->age += p.age;
        return *this;
    }

};

void test01() {
    Person p1(11);
    //结果:p1的年龄为:11
    cout << "p1的年龄为:" << p1.age << endl;
}

void test02() {
    Person p1(11);
    Person p2(11);
    //链式编程思想
    p2.PersonAddAge(p1).PersonAddAge(p1).PersonAddAge(p1).PersonAddAge(p1);
    //结果:p2的年龄为:22
    cout << "p2的年龄为:" << p2.age << endl;
}

int main() {
    test01();
    test02();
}

图示:

原理:

如果是以值的方式返回,每次都会创建一个新的对象,即每次都会创建一个p2的拷贝,但修改后的数据不会呈现在p2上

 

posted @ 2024-03-07 16:23  バカなの  阅读(4)  评论(0编辑  收藏  举报