今天在整理笔记的时候,发现笔记本上只有“+”重载运算符的友元函数的形式,没有成员函数的重载形式,但是根据重载的规则,这个运算符也是可以用成员函数的重载方式的,便开始了自己的尝试,然后我发现了一个问题,会报错“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 }
编译成功!