1.this 指针
this指针指向用来调用成员函数的对象(this
被作为隐藏的参数传递给方法)。每一个成员函数(包括构造函数和析构函数)都有一个this指针,this
指针指向调用对象。如果方法需要引用整个调用对象,则可以使用表达式*this
,在函数的括号后面使用const*
限定符将this
限定为const
,这样将不能使用this
来修改对象的值。然而,要返回的并不是this
,因为this
是对象的地址,而是对象本身,即*this
(将解除引用运算符用于指针,将得到指针指向的值),现在,可以将*this
作为调用对象的别名来完成前面的方法定义。
注意:静态成员函数参数不含this指针。
当使用一个对象调用一个方法时,如:
object.method(...)
等价于object.method(&object,...)
,即编译器将object
的地址传递给隐形参数this
.
2. 利用const隐式的修改this指针类型
摘自《C++ Primer 5》中的一段代码
struct Sales_data
{
std::string isbn() const { return bookNo; }
Sales_data& combine(const Sales_data&);
double arg_price() const;
string bookNo;
unsigned unit_sold = 0;
double revenue = 0.0;
};
首先std::string isbn() const { return bookNo; }
等价于std::string isbn() const { return this->bookNo; }
那么在类中定义的的成员函数isbn()
为何要在函数跟一个const
?
2.1 const常量
const int a=0; //这是一个顶层const,因为我们无法修改a的值,
int x = 1;
const int y = &x; //错误,不可以把一个非常量绑定到一个常量上
const int y = x; //正确
const int &y = x; //正确,允许将const int&绑定到一个普通int对象上
总之,我们可以把一个const
常量绑定到一个普通的变量上,但是不可以把一个非常量绑定到一个常量上。对于一般的内置类型来说,const
没有顶层与底层之分,对于指针来说这个区分就很重要了。
2.2指向常量的指针:
const double pi =3.14;
const double *cptr = π//此时的const为底层const,仅仅要求不能通过该指针改变对象的值。
const指针(必须初始化):
int errNum = 0;
int *const curErr = &errNum ;//curErr 将一直指向errNum,但 errNum的内容可以变
this
指针默认的是指向非常量的常量指针,即 Sales_data *const this
,由于不可以把一个非常量绑定到一个常量 ,所以我们在调用类Sales_data
的成员函数isbn的时候如果将Sales_data
声明为常量会引发错误。为了使Sales_data
类的应用更广泛,防止日后调用报错,我们在这里把isbn()
函数的this
指针声明为const
就很有必要了。C++中声明this
指针为常量的做法就是在函数后面紧跟一个const
,此时isbn()
叫做常量成员函数。
参考书籍:《C++ Primer 5》