首先来看一下如下代码,之前在学习命名空间的时候知道用using namespace std;声明后直接调用cout就不用写前面的std::,那么在matest函数中,给m_a赋值为什么是A::m_a呢
#include <iostream>
using namespace std;
class A
{
public:
A(int a):m_a(a){}
void matest(int n);
void macout()
{
cout << m_a << endl;
}
private:
int m_a;
};
void A::matest(int n)
{
m_a = n;
}
int main()
{
A a(1);
a.macout();
a.matest(10);
a.macout();
return 0;
}
1
10
在调用成员函数时,编译器负责把这个对象的地址(&a)传递给这个成员函数中的一个隐藏的this形参。
在系统角度看来,任何对类成员的直接访问都被看成是通过this做隐式调用的。
a.matest(10);//可以理解为a.matest(&a,10);
在matest函数中的赋值
m_a = 10;//其实是this->m_a = 10
this是有一个const的修饰
- this指针只能在成员函数中使用,全局函数、静态函数都不能使用this指针。
- 在普通成员函数中,this是一个指向非const对象的const指针(类型为A,那么this就是 A *const this),表示this只能指向当前A对象的对象指针。
- 在const成员函数中,this指针是一个指向const对象的const指针(在mutable博客中提到,const修饰的函数里面不能修改类参数的任何状态,类型为A,this就是const A *const this类型的指针)
#include <iostream>
using namespace std;
class A
{
public:
A(int a):m_a(a){}
A& matest(int m_a);
void macout()
{
cout << m_a << endl;
}
private:
int m_a;
};
A& A::matest(int m_a)
{
m_a = m_a;
return *this;//把对象自己给返回回去
}
int main()
{
A a(1);
a.macout();
a.matest(10);
a.macout();
return 0;
}
以上代码中m_a与A::m_a是一样的,那么a.matest(10);的调用结果如下
1
1
这时候就可以用this来区分
this->m_a = m_a;
1
10
还有一种比较有意思的是
#include <iostream>
using namespace std;
class A
{
public:
A(int a):m_a(a){}
A& matest(int m_a);
void macout()
{
cout << m_a << endl;
}
private:
int m_a;
};
A& A::matest(int m_a)
{
this->m_a = m_a;
return *this;//把对象自己给返回回去
}
int main()
{
A a(1);
a.macout();
a.matest(10).matest(15).macout();
return 0;
}
结果
1
15
因为A::matest返回的是对象自己,所以可以接着进行操作。