浅析this指针
文章目录
- 浅析this指针
- 前言
- this指针作用
- this指针使用
- 注意事项
- 总结
前言
在面向对象的编程语言中,this
指针是一个自引用指针,通常用于指向对象自身。通过这篇文章,我们将探讨this
指针的核心特性、应用场景和相关案例。
this指针作用
一个对象的this指针并不是对象本身的一部分,不会影响 sizeof(对象) 的结果。
this作用域是在类内部,当在类的非静态成员函数中访问类的非静态成员的时候,编译器会自动将对象本身的地址作为一个隐含参数传递给函数。也就是说,即使你没有写上this指针,编译器在编译的时候也是加上this的,它作为
非静态成员函数的隐含形参
,对各成员的访问均通过this进行。
首先我们验证:this指针并不是对象本身的一部分
namespace test1
{class A{public:A(int val = 0):m_val(val){}private:int m_val;};void test(){cout << "size of A object = " << sizeof(A) << endl; // 4}
}
如果 this 指针归属于类A所产生的对象,那么 sizeof(A) 得到的结果注定大于4,所以验证了 this 指针并不是对象本身的一部分。
其次验证:编译器会自动将对象本身的地址(this指针)作为一个隐含参数传递给函数
namespace test2
{class Person{public:Person(const string& name, int age = 0):m_age(age), m_name(name){}// 注意下面两个 getAge() 函数可以构成重载int getAge(){cout << "Non-const getAge()" << endl;return m_age;}int getAge()const{cout << "Const getAge()" << endl;return m_age;}private:int m_age;string m_name;};void test(){Person man1("zoufeng");const Person man2("zoufeng");man1.getAge();man2.getAge();}
}
运行结果:
我们注意思考一个问题,为什么上面案例代码中的两个 getAge() 函数可以构成重载,表象上看函数参数、函数名全都一致,为什么编译器没有报错呢?如果细心会看到第二个 getAge() 函数后面有 const 关键字修饰,正如我们所知 const 修饰成员函数可以避免函数内部修改类内成员变量,提供更高的安全性。而我们想到函数内修改类内成员变量值时正是出于 this 指针的引导才能找到自身对象所对应的成员变量,函数外部加 const 修饰就限制了修改,说明这个 const 本质上不是给函数修饰的,真正修饰的是作为传给非静态函数隐含参数的 this 指针!将 this
变为 const this
从而限制了函数内部的修改。
如果您对 const 修饰成员函数有疑问,参阅详见:C++之善用const修饰成员函数
this指针使用
(1)在类的非静态成员函数中返回类对象本身的时候,直接使用 return *this。
(2)当参数与成员变量名相同时,如this->n = n (不能写成n = n)。
- 链式操作: 通过返回*this, 可以连续调用当前对象上的其他方法。
class Person
{
public:Person(const string& name, int age = 0):m_age(age), m_name(name){}// ...Person& setAge(int age) // 实现链式调用{this->m_age = age;return *this;}
private:int m_age;string m_name;
};void test()
{Person *man1 = new Person("zoufeng");cout << man1->getAge() << endl;cout << man1->setAge(100).getAge() << endl; // 链式调用delete man1;
}
运行结果:
注意事项
虽然 this
指针具有多种用途, 但也需要注意不要在构造函数和析构函数中返回*this。因为这样会导致对象的复制或者销毁,可能引发错误或者内存泄漏。
总结
this
指针是 C++ 中一个重要的概念,它可以帮助我们更好地理解和使用类和对象。通过本文,我们了解了this
指针的基本概念,案例分析,拓展知识和注意事项。希望这篇文章对你有所帮助,如果你有任何问题或者建议,欢迎留言或者联系我。