1.this 指针的引入
每个成员函数(static函数外)都有一个额外的隐含的this指针,一个类对象在条用成员函数时this指针初始化为调用函数对象的地址。
例1
//Sales_item.h
class Sales_item
{
public:
bool same_isbn(const Sales_item &) const;
private:
string isbn;
unsigned units_sold;
double revenue;
}
//Sales_item.cpp
bool Sales_item::same_isbn(const Sales_item & rhs) const
{
return (isbn == rhs.isbn); *
}
Sales_item item1,item2;
Item.same_isbn(item2);
编译器会重写这个函数调用:
Sales_item::isbn(&item1,item2);
*也即为 return (item1.isbn == item2.isbn);
2.const 成员函数
在非const成员函数中(如例1),this指针是指向 Sales_item 类型的const 指针,即Sales_item *const 类型,而在const成员函数中则为const Sales_item * const类型。
因此例1又与下面的代码一样:
bool Sales_item::same_isbn(const Sales_item * const this,
const Sales_item &rhs) const
{
return (this->isbn == rhs.isbn);
}
3.this 指针的使用
a.怎样使用this指针
在成员函数中不必显示地使用this指针来访问函数所属对象的成员,由于this指针是隐式定义的,因此不需要在成员函数的形参表中包含this指针,实际上这样也是非法的,无法通过编译,而在函数体内可以显示地使用this。
下面代码与例1相同但没必要
bool Sales_item::same_isbn(const Sales_item & rhs) const
{
return (this->isbn == rhs.isbn);
}
b.何时使用this指针
在一个成员函数中,当我们需要将一个对象作为一个整体引用而不对象的某一个数据成员,最常见的是一个成员函数返回对象的引用。
例2
class A
{
public:
A &fun1();
A &fun2();
private:
......
};
A obj;
obj.fun1().fun2()(等价于obj.fun1(); obj.fun2;)
当我们想像上面这样用时,那么我们fun1()和fun2()必须这样写
A& A::fun1(){...... return this;}
A& A::fun2(){...... return this;}
4.从 const 成员函数返回 this
考虑在A类中再加入另一个成员函数:
A &fun3() const;假设该函数已定义且函数体内最后也是return this;
那么请看下面的用法;
obj.fun3().fun1();
那么这时用法就会出现错误,fun3成员函数返回this指针是const A *const 类型,即一个指向const A类型的 const 指针,他不能用来调用非const成员函数(const 类类型对象、指针或引用无法调用非const 成员函数)。
针对这个问题,我们可以使用基于 const 成员函数的重载,即定义两个版本的fun3函数:
A &fun3()
const A &fun3() const;
参考文献:《C++ primer》
每个成员函数(static函数外)都有一个额外的隐含的this指针,一个类对象在条用成员函数时this指针初始化为调用函数对象的地址。
例1
//Sales_item.h
class Sales_item
{
public:
bool same_isbn(const Sales_item &) const;
private:
string isbn;
unsigned units_sold;
double revenue;
}
//Sales_item.cpp
bool Sales_item::same_isbn(const Sales_item & rhs) const
{
return (isbn == rhs.isbn); *
}
Sales_item item1,item2;
Item.same_isbn(item2);
编译器会重写这个函数调用:
Sales_item::isbn(&item1,item2);
*也即为 return (item1.isbn == item2.isbn);
2.const 成员函数
在非const成员函数中(如例1),this指针是指向 Sales_item 类型的const 指针,即Sales_item *const 类型,而在const成员函数中则为const Sales_item * const类型。
因此例1又与下面的代码一样:
bool Sales_item::same_isbn(const Sales_item * const this,
const Sales_item &rhs) const
{
return (this->isbn == rhs.isbn);
}
3.this 指针的使用
a.怎样使用this指针
在成员函数中不必显示地使用this指针来访问函数所属对象的成员,由于this指针是隐式定义的,因此不需要在成员函数的形参表中包含this指针,实际上这样也是非法的,无法通过编译,而在函数体内可以显示地使用this。
下面代码与例1相同但没必要
bool Sales_item::same_isbn(const Sales_item & rhs) const
{
return (this->isbn == rhs.isbn);
}
b.何时使用this指针
在一个成员函数中,当我们需要将一个对象作为一个整体引用而不对象的某一个数据成员,最常见的是一个成员函数返回对象的引用。
例2
class A
{
public:
A &fun1();
A &fun2();
private:
......
};
A obj;
obj.fun1().fun2()(等价于obj.fun1(); obj.fun2;)
当我们想像上面这样用时,那么我们fun1()和fun2()必须这样写
A& A::fun1(){...... return this;}
A& A::fun2(){...... return this;}
4.从 const 成员函数返回 this
考虑在A类中再加入另一个成员函数:
A &fun3() const;假设该函数已定义且函数体内最后也是return this;
那么请看下面的用法;
obj.fun3().fun1();
那么这时用法就会出现错误,fun3成员函数返回this指针是const A *const 类型,即一个指向const A类型的 const 指针,他不能用来调用非const成员函数(const 类类型对象、指针或引用无法调用非const 成员函数)。
针对这个问题,我们可以使用基于 const 成员函数的重载,即定义两个版本的fun3函数:
A &fun3()
const A &fun3() const;
参考文献:《C++ primer》