C++this指针与函数重载

本文探讨了C++中重载函数的实现原理,通过范例分析了scheme-A和scheme-B两种情况下的成员函数重载。重点在于const成员函数与非const成员函数的区别,特别是this指针的const限定对函数调用的影响。在scheme-1中,由于const隐藏参数的差异,重载函数能够正确区分,避免了编译错误。而在scheme-2中,由于缺少const限定,导致了二义性,从而引发编译错误。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


1 范例分析

/*----------------test.h----------------*/
#include <iostream>
using namespace std;
class ttclass
{
  public:
    /*重载1:
      [1] 采用schme-A时,“重载1”和“重载2”可正常执行;
      [2] 采用scheme-B时,程序将报错!!!
    */
    int get_aa() const   /*scheme-A*/
    //int get_aa()       /*scheme-B: */
    {
      cout<<"Now is get_aa(), a="<<a<<endl;
      return a;
    }
    /*重载2:
      作用:由于该函数返回值为类成员变量a的引用,故可将函数get_aa作为左值进而修改类成员变量a的数值!
    */
    int& get_aa()
    {
      cout<<"Now is get_aa(Reference), a="<<a<<endl;
      return a;
    }
    int a;
};

/*----------------test.cpp----------------*/
#include "test.h"
int main()
{
  ttclass kk;
  kk.a=100;
  kk.get_aa(); //重载1
  cout<<" [1] aa="<<kk.a<<endl;
  kk.get_aa()=999; //重载2
  cout<<" [2] aa="<<kk.a<<endl;
  return 1;
}

采用g++编译
g++ -std=c++11 test.cpp -o kk

> ./kk
   Now is get_aa(Reference), a=100
   [1] aa=100
   Now is get_aa(Reference), a=100
   [2] aa=999

从上述结果可知,重载2作为左值时,确实可以修改类成员变量a的数值!

2 为何scheme-1不报错呢?

因为采用scheme-1时,实际上重载1重载2有1个隐藏参数类型是不同的!

  • int get_aa() const中的隐藏参数this指针类型为const this;
  • int& get_aa()中隐藏参数this指针类型为this

因此,schme-1时,代码不报错!而scheme-2时代码报错!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值