this指针
一.成员变量与成员函数
•相同类型的不同对象各自拥有独立的成员变量实例
•相同类型的不同对象彼此共享同一份成员函数代码
•为相同类型的不同对象所共享 的成员函数,如何区分所访问 的成员变量隶属于哪个对象?
–void User::print (void)
{
cout << m_name << ", " << m_age << endl;
}
–User user1 ("zhangfei", 22);
User user2 ("zhaoyun", 20);
user1.print (); // zhangfei, 22
user2.print (); // zhaoyun, 20
二.this指针
•类的每个成员函数都有一个隐藏的指针型参数this,指向调用该成员函数的对象,这就是this指针
–void User::print (void) { … }
void _ZN4User5printEv (User* this) { … }
–user1.print ();
_ZN4User5printEv (&user1);
•类的构造和析构函数中同样有this指针,指向这个正在被构造或析构的对象
•在类的成员函数、构造函数和析构函数中,对所有成员的访问,都是通过this指针进行的
•事实上,在类的成员函数、构造函数和析构函数中,也可以显式地通过this指针访问该类的成员
三.显式使用this指针
•多数情况下,程序并不需要显式地使用this指针,编译器通过名字解析,可以判断出所访问的标识符是否属于该类的成员,是则为其加上“this->”
•在构造函数内部,除了使用初始化表外,还可以通过this指针,将同名的成员与非成员区分开来
•在类的成员函数中,通过this指针向该成员函数的调用者,返回调用对象的自拷贝或自引用
•将this指针作为函数的参数,从一个对象传递给另一个对象,可以实现对象间的交互
常函数
一.修饰this指针的const
•在类成员函数的形参表之后,函数体之前加上const关键字,该成员函数的this指针即具有常属性,这样的成员函数被称为常函数
•在常函数内部,因为this指针被声明为常量指针,所以无法修改成员变量的值,除非该成员变量被mutable关键字修饰
–class User
{
...;
mutable unsigned int m_times;
};
–void User::print (void) const
{
cout << m_name << ", " << m_age << endl; m_name = ""; // 编译错误
m_age++; // 编译错误
++m_times;
}
二.常对象只能调用常函数
•通过常对象调用成员函数,传递给该成员函数this指针参数的实参是一个常量指针
–User user (…);
User const* cptr = &user;
User const& cref = user;
–void User::modify (void) { ... }
void _ZN4User6modifyEv (User* this) { ... }
void User::print (void) const { ... }
void _ZNK4User5printEv (User const* this) { ... }
–cptr->modify (); // 错误
_ZN4User6modifyEv (cptr);
cref.print (); _
ZNK4User5printEv (&cref);
三.常函数与非常函数构成重载
•原型相同的成员函数,常版本和非常版本构成重载
–class Array
{
int const& at (size_t) const;
int& at (size_t i);
};
–Array array (...);
•常对象选择常版本
–Array const& cref;
cout << cref.at (0) << endl;
•非常对象选择非常版本
–array.at (0) = 100;
•如果没有非常版本,非常对象也能选择常版本
–cout << array.at (0) << endl;