为什么在 + 运算符重载函数返回的对象上重载 << 时会出错
Why do I get an error when I overload the << on the object returned by the + operator overloaded function
class String
{
char* array;
public:
String(const char* s)
{
array = new char[strlen(s) + 1]{ '[=10=]' };
strcpy(array, s);
}
~String()
{
if (array)
{
delete[]array;
}
}
String operator+ (const char* p) //返回对象
{
String temp(p);
char* tempStr = temp.array;
temp.array = new char[strlen(array) + strlen(tempStr) + 1]{ '[=10=]' };
strcpy(temp.array, array);
strcat(temp.array, p);
delete[]tempStr;
return temp;
}
friend ostream& operator<<(ostream& output, String& x); // <<函数重载只能定义成友元
};
ostream& operator << (ostream& output, String& x) //对<<重载的方式
{
output << x.array;
return output;
}
int main()
{
String string1("mystring");
cout << string1 + "ab" << endl;
cout << string1 << endl;
return 0;
}
第一次在这里提问,如有描述不当请见谅:)
回到重点,我已经重载了+
和<<
运算符,所以我想通过cout<<string1+"ab"<<endl
得到输出“mystringab
”,但是输出是乱码。
我认为+
运算符重载函数可能有问题,谁能告诉我问题出在哪里?
而如果我想得到正确的结果,我应该如何重写重载函数?
问题是要重载 operator<<
的第二个参数不能绑定到 String
右值,因为第二个参数是 对 non-const 的左值引用String
.
how should I rewrite the overloaded function?
您需要将第二个参数重载为 operator<<
一个 const String&
以便它也可以与第二个参数 "ab"
一起使用,如下所示:
//---------------------------------------- vvvvv------------>low-level const added here
friend ostream& operator<<(ostream& output,const String& x);
同样在定义中做同样的事情:
//----------------------------------- vvvvv------------>low-level const added here
ostream& operator << (ostream& output,const String& x)
{
output << x.array;
return output;
}
此外,请确保您的程序没有任何未定义的行为。例如,确保仅在安全的情况下使用 delete
或 delete[]
(不再需要指针指向的数据)。您可以使用 valgrind 等工具来检测一些基本问题。
class String
{
char* array;
public:
String(const char* s)
{
array = new char[strlen(s) + 1]{ '[=10=]' };
strcpy(array, s);
}
~String()
{
if (array)
{
delete[]array;
}
}
String operator+ (const char* p) //返回对象
{
String temp(p);
char* tempStr = temp.array;
temp.array = new char[strlen(array) + strlen(tempStr) + 1]{ '[=10=]' };
strcpy(temp.array, array);
strcat(temp.array, p);
delete[]tempStr;
return temp;
}
friend ostream& operator<<(ostream& output, String& x); // <<函数重载只能定义成友元
};
ostream& operator << (ostream& output, String& x) //对<<重载的方式
{
output << x.array;
return output;
}
int main()
{
String string1("mystring");
cout << string1 + "ab" << endl;
cout << string1 << endl;
return 0;
}
第一次在这里提问,如有描述不当请见谅:)
回到重点,我已经重载了+
和<<
运算符,所以我想通过cout<<string1+"ab"<<endl
得到输出“mystringab
”,但是输出是乱码。
我认为+
运算符重载函数可能有问题,谁能告诉我问题出在哪里?
而如果我想得到正确的结果,我应该如何重写重载函数?
问题是要重载 operator<<
的第二个参数不能绑定到 String
右值,因为第二个参数是 对 non-const 的左值引用String
.
how should I rewrite the overloaded function?
您需要将第二个参数重载为 operator<<
一个 const String&
以便它也可以与第二个参数 "ab"
一起使用,如下所示:
//---------------------------------------- vvvvv------------>low-level const added here
friend ostream& operator<<(ostream& output,const String& x);
同样在定义中做同样的事情:
//----------------------------------- vvvvv------------>low-level const added here
ostream& operator << (ostream& output,const String& x)
{
output << x.array;
return output;
}
此外,请确保您的程序没有任何未定义的行为。例如,确保仅在安全的情况下使用 delete
或 delete[]
(不再需要指针指向的数据)。您可以使用 valgrind 等工具来检测一些基本问题。