【C++】this指针

本文详细介绍了C++中this指针的作用、使用场景,包括区分形参和成员变量、在成员函数返回对象本身以及链式调用中的应用。还通过实例展示了静态成员函数与this指针的区别。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

【this指针】(重要)

1、this指针的引入

2.【this指针的使用】


【this指针】(重要)

c++的封装性:将数据 和 方法 封装在一起

数据 和 方法 是分开存储。

每个对象 拥有独立的数据.每个对象 共享同一个方法。

1、this指针的引入

#include <iostream>

using namespace std;

class Data {
public:
    int m_num;

    void setNum(int num) {
        m_num = num;
    }
};

void test01() {
    Data ob1;
    ob1.setNum(10);
    cout << "ob1.m_num = " << ob1.m_num << endl;

    Data ob2;
    ob2.setNum(20);
    cout << "ob2.m_num = " << ob2.m_num << endl;

    Data ob3;
    ob3.setNum(30);
    cout << "ob3.m_num = " << ob3.m_num << endl;
}

int main() {
    test01();
    return 0;
}

运行结果:

#include <iostream>

using namespace std;

class Data {
public:
    int m_num;

    void setNum(int num) {
        // m_num = num;
        this->m_num = num;
    }
};

void test01() {
    Data ob1;
    ob1.setNum(10);
    cout << "ob1.m_num = " << ob1.m_num << endl;

    Data ob2;
    ob2.setNum(20);
    cout << "ob2.m_num = " << ob2.m_num << endl;

    Data ob3;
    ob3.setNum(30);
    cout << "ob3.m_num = " << ob3.m_num << endl;
}

int main() {
    test01();
    return 0;
}

注意:

1、this指针是隐含在对象成员函数内的一种指针

2、成员函数通过this指针即可知道操作的是那个对象的数据

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

(静态成员函数 是属于类 函数内部 没有this指针)

2.【this指针的使用】

1、当形参和成员变量同名时,可用this指针来区分

class Data 
{
public:
    int num;

    // 形参和成员名相同
    void setNum(int num) {
        // 形参num
        // 成员num this->num
        // num = num; // 就近原则,形参num赋值给形参num
        this->num = num; // 将形参num赋值给对象中成员num
    }
};

2、在类的普通成员函数中返回对象本身(*this)(重要)‘

#include <iostream>

using namespace std;

class MyCout {
public:
    MyCout& myCout(char *str) {
        cout << str;
        return *this; // *this 代表就是当前调用该函数的对象
    }
};

int main() {
    MyCout ob;

    /*
    ob.myCout("hehe");
    ob.myCout("haha");
    ob.myCout("xixi");
    */

    ob.myCout("hehe").myCout("haha").myCout("xixi"); // ob.myCout("hehe") == ob

    return 0;
}

链式调用

支持链式调用的成员函数特点:

1、 返回值是当前类的引用

2、 return 后面是*this

#include <iostream>
#include <string>

using namespace std;

class Fish {
private:
    string breed;
    int weight;

public:
    Fish(const string& b, int w) : breed(b), weight(w) {}

    // Getter and Setter for breed
    string getBreed() const {
        return breed;
    }

    void setBreed(const string& b) {
        breed = b;
    }

    // Getter and Setter for weight
    int getWeight() const {
        return weight;
    }

    void setWeight(int w) {
        weight = w;
    }
};

class Cat {
public:
    Fish& eat(Fish& f) {
        if (f.getBreed() == "秋刀鱼") {
            cout << "无论多沉,我都爱吃。" << endl;
            f.setWeight(0);
            return f;
        } else {
            if (f.getWeight() > 200) {
                cout << "吃鱼!" << endl;
                f.setWeight(0);
                return f;
            } else {
                cout << "鱼太轻了,我不吃。" << endl;
                return f;
            }
        }
    }
};

int main() {
    Fish aodao("秋刀鱼", 180);
    Fish otherFish("其他鱼", 220);

    Cat cat;
    
    Fish resultAodao = cat.eat(aodao);
    cout << "Aodao's weight after eating: " << resultAodao.getWeight() << endl;

    Fish resultOtherFish = cat.eat(otherFish);
    cout << "Other fish's weight after eating: " << resultOtherFish.getWeight() << endl;

    return 0;
}

### C++ 中 `this` 指针的概念 在 C++ 编程语言中,`this` 是一个特殊的指针变量,在类的非静态成员函数内部自动存在。它指向当前正在被操作的对象实例[^1]。通过使用 `this` 指针,可以访问对象的数据成员以及成员函数。 #### 为什么需要 `this` 指针? 当在一个类的方法中定义了一个局部变量或者参数名与数据成员同名时,可能会发生命名冲突。此时可以通过 `this->` 来区分它们,其中 `this` 明确表示的是当前对象的数据成员[^2]。 --- ### `this` 指针的主要用途 以下是几种常见的场景下 `this` 的应用方式: #### 1. 解决名称冲突 如果某个方法接收的参数名字与其所属类中的成员变量相同,则可以用 `this` 指向实际的成员变量来消除歧义。 ```cpp #include <iostream> using namespace std; class Person { private: string name; public: void setName(string name) { this->name = name; // 使用 this 区分成员变量和形参 } void getName() const { cout << "Name is: " << name << endl; } }; int main(){ Person p; p.setName("Alice"); p.getName(); return 0; } ``` 上述例子展示了如何利用 `this` 避免因重名而产生的混乱情况。 #### 2. 返回当前对象本身 返回 *current object* 可用于链式调用(chaining),即连续执行多个操作于同一个对象之上而不需重复指定目标实体。 ```cpp class Counter{ private: int count; public: Counter():count(0){} Counter& increment(){ ++count; return *this; // 返回自身的引用以便支持连贯调用 } void displayCount()const{ cout<<"Current Count:"<<count<<endl; } }; // 测试部分省略... ``` 这里展示了一种模式——允许像这样写代码:`counter.increment().increment()`[^3]。 #### 3. 调用其他成员函数 有时候可能希望从某成员函数内部去触发另一个成员函数的动作;这时就可以借助 `this` 实现这一点。 ```cpp void bar() { std::cout << "Inside bar()" << std::endl; this->foo(); // 利用 this 呼叫另一项功能 } ``` 此片段取自先前提供的资料说明了怎样借由 `this` 执行额外的功能呼叫。 #### 4. 动态分配内存给对象副本 另外一种常见情形是在构造器里复制传入的对象属性值到新建立出来的个体之中,这时候也可以运用 `this`. ```cpp Person(const Person &other){ *(this)= other;// 将 another 对象的内容赋值给自己 } ``` 注意这里的语法结构意味着把右侧表达式的全部字段逐一对应拷贝至左侧所代表的新建体当中[^4]。 --- ### 总结注意事项 尽管 `this` 提供了许多便利之处,但也有一些地方值得特别留意: - 它仅存在于非静态成员函数之内; - 不可手动修改其地址值; - 当涉及多线程环境下的共享资源管理时要格外小心同步问题等等。 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值