C++ OOP 面试高频知识点 - 11
this 指针:本质、const this、*this 返回对象
1. this 指针的基本概念
this 指针 是一个隐含的指针,它在每个成员函数中都存在,指向调用该函数的对象。
class MyClass {
public:
void printAddress() {
cout << "Object address: " << this << endl;
}
void setValue(int x) {
this->x = x; // 显式使用 this 指针
}
int getValue() {
return x; // 隐式使用 this 指针
}
private:
int x;
};
int main() {
MyClass obj;
cout << "Object address: " << &obj << endl;
obj.printAddress(); // 调用成员函数
return 0;
}
2. this 指针的本质
this 指针的本质是一个隐式的参数,传递到每个成员函数中。它是一个 const 指针,意味着我们不能改变它的值。
class MyClass {
public:
void invalid() {
this = nullptr; // 错误:this 指针是 const 指针
}
};
3. const this
我们可以使用 const 修饰符来限制 this 指针的权限:
3.1 成员函数的 const 修饰符
class MyClass {
public:
// 成员函数的 const 修饰符表示函数不会修改对象的状态
void print() const {
cout << "Value: " << x << endl;
}
int getValue() const {
return x;
}
void setValue(int x) {
this->x = x;
}
private:
int x;
};
int main() {
const MyClass constObj;
constObj.print(); // 正确
constObj.getValue(); // 正确
// constObj.setValue(5); // 错误:const 对象不能调用非 const 成员函数
return 0;
}
3.2 const 成员函数的权限
const 成员函数只能调用其他 const 成员函数,不能调用非 const 成员函数。
class MyClass {
public:
void nonConstFunction() {
cout << "Non-const function" << endl;
}
void constFunction() const {
cout << "Const function" << endl;
// nonConstFunction(); // 错误:const 成员函数不能调用非 const 成员函数
}
};
4. *this 返回对象
成员函数可以返回 *this,这允许链式调用。
4.1 返回对象本身
class MyClass {
public:
MyClass& setX(int x) {
this->x = x;
return *this; // 返回对象本身
}
MyClass& setY(int y) {
this->y = y;
return *this; // 返回对象本身
}
void print() {
cout << "x = " << x << ", y = " << y << endl;
}
private:
int x, y;
};
int main() {
MyClass obj;
obj.setX(5).setY(10); // 链式调用
obj.print(); // 输出:x = 5, y = 10
return 0;
}
4.2 返回对象副本
class MyClass {
public:
MyClass(int x, int y) : x(x), y(y) {}
MyClass operator+(const MyClass& other) const {
return MyClass(x + other.x, y + other.y); // 返回临时对象
}
MyClass& operator+=(const MyClass& other) {
x += other.x;
y += other.y;
return *this; // 返回对象本身
}
void print() {
cout << "x = " << x << ", y = " << y << endl;
}
private:
int x, y;
};
int main() {
MyClass obj1(1, 2);
MyClass obj2(3, 4);
MyClass obj3 = obj1 + obj2; // 调用 operator+ 并返回副本
obj3.print(); // 输出:x = 4, y = 6
obj1 += obj2; // 调用 operator+= 并返回对象本身
obj1.print(); // 输出:x = 4, y = 6
return 0;
}
5. this 指针的用途
5.1 区分成员变量和局部变量
class MyClass {
public:
void setX(int x) {
this->x = x; // this 指针用于区分成员变量和局部变量
}
private:
int x;
};
5.2 返回对象本身
class MyClass {
public:
MyClass& increment() {
x++;
return *this;
}
private:
int x;
};
5.3 在对象内部访问自身地址
class MyClass {
public:
void printAddress() {
cout << "Object address: " << this << endl;
}
};
6. 常见问题和回答
问题 1:this 指针的类型是什么?
this 指针的类型取决于成员函数是否是 const 成员函数:
- 对于非 const 成员函数:
MyClass* const(指向 MyClass 对象的 const 指针) - 对于 const 成员函数:
const MyClass* const(指向 const MyClass 对象的 const 指针)
问题 2:this 指针可以为 nullptr 吗?
在正常情况下,this 指针不会为 nullptr,但在一些错误的情况下,可能会出现:
class MyClass {
public:
void foo() {
cout << this << endl;
}
};
int main() {
MyClass* ptr = nullptr;
ptr->foo(); // 未定义行为,但可能打印 nullptr
return 0;
}
问题 3:可以在构造函数和析构函数中使用 this 指针吗?
可以,但要注意:
- 在构造函数中,虚函数不会被多态调用
- 在析构函数中,虚函数也不会被多态调用
class Base {
public:
Base() {
this->foo(); // 调用 Base::foo(),不是 Derived::foo()
}
virtual void foo() {
cout << "Base::foo" << endl;
}
~Base() {
this->foo(); // 调用 Base::foo()
}
};
class Derived : public Base {
public:
void foo() override {
cout << "Derived::foo" << endl;
}
};
问题 4:this 指针的位置?
this 指针的位置取决于编译器,但通常通过寄存器(如 ecx)或栈传递。
7. 最佳实践
- 避免在成员函数外部使用:this 指针只在成员函数内部有效
- 明确使用:在成员变量名与参数名冲突时,明确使用 this 指针
- 返回对象时考虑语义:根据需求选择返回引用或副本
- 注意 const 修饰符:正确使用 const 成员函数,保持语义一致性
总结
this 指针是 C++ 中一个非常重要的概念,它允许对象访问自身的成员变量和成员函数。通过 this 指针,我们可以实现链式调用、区分局部变量和成员变量,并实现复杂的操作符重载。
了解 this 指针的本质和用法对于编写高质量的 C++ 代码是非常重要的。
练习建议: 1. 实现一个支持链式调用的类 2. 编写一个包含 const 成员函数和非 const 成员函数的类 3. 实现几个操作符重载函数,返回对象本身 4. 设计一个类,在构造函数和析构函数中使用 this 指针