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》
本文详细解析了C++中this指针的概念及其在成员函数中的作用,同时深入探讨了如何利用const关键字来限制this指针的使用,确保对象在调用常量成员函数时不会被修改。

351

被折叠的 条评论
为什么被折叠?



