C/C++ this指针 和 利用const隐式的修改this指针类型

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.14const double *cptr = π//此时的const为底层const,仅仅要求不能通过该指针改变对象的值。
const指针(必须初始化):
int errNum = 0int *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》

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

WJsuperrunner

你的鼓励是我最大的动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值