C++过载:[错误]'operator ='(操作数类型是'String'和'String')不匹配

C++过载:[错误]'operator ='(操作数类型是'String'和'String')不匹配

问题描述:

我正在学习C++,学习Visual C++教科书。
当我想重载operator +时,我用于重载operator =的代码出错了。
C++过载:[错误]'operator ='(操作数类型是'String'和'String')不匹配

#include <iostream> 
#include <string.h> 
using namespace std; 
//This demo shows how default operator may cause conflict, so we use overloaded operator instead 
class String{ 
    private: 
     char* string; 
     int len; 
    public: 
     String(const char*); 
     String(); 
     ~String(){delete [] string;} 
     String& operator=(String&);  //In the book it used //String & operator=(String&) but it went wrong 
             //String object which returned by + only got value, not an initiated object 
     String operator+(String&);  //Opreator + 
     void show_string(){ 
      cout << "String: " << string << " \tString Address: " << (void*)string << " \tLength: " << len << endl; 
     } 
}; 

String::String():len(0){  //Constructor with no argument 
    string = new char[len+1]; 
    string[0] = '\0'; 
} 

String::String(const char* i_string):len(strlen(i_string)){ //Constructor 
    string = new char[len+1]; 
    strcpy(string,i_string); 
} 

String& String::operator=(String& str_ref){  //Overloading operator = 
//The function get reference and return itself 
    delete [] string; 
    cout << "Overloading Operator =...\n"; 
    len = str_ref.len; 
    string = new char[len+1]; 
    strcpy(string,str_ref.string); 
    return *this; 
} 

String String::operator+(String& str){ 
    cout << "Overloading Operator +...\n"; 
    char* strbuf = new char[len+str.len+1]; 
    strcpy(strbuf,string); 
    strcat(strbuf,str.string); 
    String retstr(strbuf); 
    delete [] strbuf; 
    return retstr;  //call by value coz we made a new String 
} 

int main(){ 
    String A_string("My "); 
    String B_string("string"),C_string; 
    cout << "Show (A_string+B_string)...\n"; 
    (A_string+B_string).show_string(); 
    C_string = A_string + B_string; 
    cout << "Show C_string...\n"; 
    C_string.show_string(); 
return 0; 
} 

这很奇怪,因为它做的很好的时候只使用运营商+运营商或个别=。

String A_string("Apple"); 
String B_string; 
B_string = A_string; 

(A_string+B_string).show_string(); 

这里的错误

In function 'int main()': 
56:11: error: no match for 'operator=' (operand types are 'String' and 'String') 
    C_string = A_string + B_string; 
     ^

note: candidate is: 
note: String& String::operator=(String&) 
String& String::operator=(String& str_ref){ \\Overloading operator = 
     ^
note: no known conversion for argument 1 from 'String' to 'String&' 

我以为我可以使用字符串参数字符串&,这是在告知书。
所以我改变了operator =的参数为String,它起作用。

String& operator=(String&); 

String& operator=(String); 

现在我迷茫的时候只使用引用或字符串。

+0

您的评论开始“在这本书中”是没有意义的,这是相同的代码 –

+0

你的对象将在运行时表现不好,因为它没有一个正确的拷贝构造 –

+0

应该是'字符串和字符串::运算符=(const String&)'。寻找一个愚蠢。 –

在此语句

C_string = A_string + B_string; 

有创建的类型String的临时对象作为

String operator+(String&);  

您可能没有一个非恒定的左值参考结合到一个临时执行操作的结果目的。

要么重写/添加赋值运算符像

String& operator=(const String&);  
        ^^^^ 

或添加移动赋值运算符。

String& operator=(String &&);  
          ^^