“this”这个关键字

一、什么是“this”?

简单来说,“this”是每个非静态成员函数隐含的指针,它指向调用该成员函数的那个对象本身

换句话说,当你调用对象的方法时,编译器会自动传入一个指针,指向你调用的“那个对象”,这个指针就是“this”。

比喻

把对象比作一辆车,“this”就像车内的一个标签,指向“这辆车自己”。每次在车内(成员函数中),你可以用“this”找到“自己”。


二、“this”的详细作用和用途

2.1 指向调用对象

  • 让成员函数知道“自己是谁”
  • 可以在成员函数中访问和修改调用者的成员

2.2 解决名字冲突

如果成员函数的参数和成员变量同名,会造成混淆。此时,用“this”可以明确区分:

class Person {
public:
    std::string name;
    void setName(const std::string& name) {
        this->name = name;  // 成员变量名 vs 参数名
    }
};

这里,this->name指成员变量,name是参数。

2.3 返回对象本身(链式调用)

“this”作为指针,可以用在函数返回值中,让函数支持链式调用(一个语句连续调用多个方法):

class Number {
public:
    int value;
    Number& setValue(int v) {
        this->value = v;
        return *this;  // 返回对象的引用
    }
    Number& add(int v) {
        this->value += v;
        return *this; 
    }
};

这样就可以写:

Number n;
n.setValue(10).add(5);

2.4 在const成员函数中的使用

  • 在定义const成员函数时,不能修改对象的成员
  • 但可以用“this”作为“const 类型指针”:
class Example {
public:
    void display() const {
        // this 是 const指针:const Example*
        // 不能通过 this 修改成员
    }
};

2.5 判断两个对象是否相等

可以用“this”进行比较:

bool isEqual(const Person& p) {
    return this == &p;
}

三、“this”的底层实现原理

  • 每个非静态成员函数都会隐式带一个指针参数(隐藏参数)
  • 编译器会在调用成员函数时自动把调用的对象地址作为“this”传入
  • “this”在成员函数中象一个普通指针,可以用->访问成员
  • 这也是为什么成员函数定义时可以用this->member,实际上就是解指针访问

举个简单的例子: 

class Foo {
public:
    void bar() {
        // 实际编译后类似
        // void bar(Foo* this) { ... }
    }
};

四、例子演示

让我们写几个例子,帮你更直观理解:

例子1:解决名字冲突

#include 
class Person {
public:
    std::string name;
    void setName(const std::string& name) {
        this->name = name; // 使用this区分成员和参数
    }
    void print() {
        std::cout << "Name: " << this->name << std::endl;
    }
};
int main() {
    Person p;
    p.setName("Alice");
    p.print();  // 输出:Name: Alice
}

例子2:链式调用

#include 
class Counter {
public:
    int value = 0;
    Counter& increment() {
        this->value++;
        return *this;  // 返回自身引用
    }
    Counter& add(int v) {
        this->value += v;
        return *this;
    }
    void show() {
        std::cout << "Counter: " << this->value << std::endl;
    }
};
int main() {
    Counter c;
    c.increment().add(10).increment().show();  // 链式调用
}

例子3:判断对象是否相等

#include 
class Person {
public:
    std::string name;
    bool isSame(const Person& p) {
        return this == &p; // 比较指针是否相等
    }
};
int main() {
    Person p1{"Tom"};
    Person p2{"Tom"};
    std::cout << p1.isSame(p2) << std::endl; // false
}

五、总结与注意事项

  • **“this”**始终指向调用的对象
  • 在成员函数中可用,但不能在静态成员函数中使用
  • 常用于名字冲突解决和链式调用
  • 使用“*this”可以获得“对象本身”,但要小心存储或返回对象引用,避免悬空指针或引用(比如返回“this”的引用时,必须保证调用者不要销毁对象)

你可能感兴趣的:(java,c++,算法)