must take either zero or one argument错误分析

       今天在整理笔记的时候,发现笔记本上只有“+”重载运算符的友元函数的形式,没有成员函数的重载形式,但是根据重载的规则,这个运算符也是可以用成员函数的重载方式的,便开始了自己的尝试,然后我发现了一个问题,会报错“must take either zero or one argument”


我的代码是这样子的

String& String:: operator+(const String& s1,const String& s2)
{
    int len = strlen(s1.str_)+strlen(s2.str_)+1;

    char* ptr = new char[len];
    memset(ptr,0,len);

    strcpy(ptr,s1.str_);
    strcat(ptr,s2.str_);

    delete []str_;
    str_ = new char[len];
    strcpy(str_,ptr);
}


 

但是老是报“ error: ‘String& String::operator+(String&, String&)’ must take either zero or one argument”,我仔细看了下代码,从逻辑上来说这个好像也没错,然后就去百度了......

百度了之后,是忽略了this指针的问题

二元运算符用成员重载时,只需要一个参数,另一个参数由this指针传入 

那为什么可以用this指针直接传入呢?

首先我们明确一点,成员函数是有this指针的,如果上面的声明定义改成友元函数是没有问题的,友元没有this指针。当运算符重载时,此时会有this指针帮助用户进行获取对象的信息,而不需要显性指明对象。 简单来说,就是当重载运算符函数的形参列表中有两个且第一个为当前对象类型时,第一个形参需要省略 ,this指针指向了第一个对象。

this指针的一般作用:

种情况就是,在类的非静态成员函数中返回类对象本身的时候,直接使用 return *this;

另外一种情况是当参数与成员变量名相同时,如this->n = n (不能写成n = n)。 

后来我把程序改了

String& String:: operator+(String& s1)
 24 {
 25     int len = strlen(s1.str_)+strlen(this->str_)+1;
 26 
 27     char* ptr = new char[len];
 28     memset(ptr,0,len);
 29 
 30     strcpy(ptr,this->str_);
 31     strcat(ptr,s1.str_);
 32 
 33     delete []str_;
 34     str_ = new char[len];
 35     strcpy(str_,ptr);
 36 
 37     return *this;
 38 
 39 }

编译成功!


  • 13
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值