C++中字符串的重载运算符
overloading operator for string in c++
我有一个名为 Fstring
的 class,里面有一个 wchar_t*
。
我写了以下内容来将字符串文字复制到 Fstring
:
#include <iostream>
using namespace std;
class Fstring{
wchar_t *arr;
public:
Fstring& operator = (const wchar_t temp[])
{
delete [] arr;
arr=new wchar_t[wcslen(temp)];
for(int i=0;i<=wcslen(temp);i++)
arr[i]=temp[i];
return *this;
}
};
int main()
{
Fstring test=L"Hello World";
return 0;
}
但是没有用。编译器给我以下错误:
error C2440: 'initializing' : cannot convert from 'const wchar_t [12]'
to 'Fstring'
我真的很困惑,我用谷歌搜索 "Overloading operators" 但所有结果都与我过去重载运算符的方式相同。那么为什么这不起作用?
当您看到 Type name = initializer
时,它没有使用赋值运算符。它正在声明一个变量,因此正在初始化(技术上 copy-initialization 或 copy-list-initialization)。这意味着它调用构造函数。由于您没有采用 const wchar_t*
的构造函数,您将收到错误。
您需要实现一个接受 const wchar_t*
的构造函数并用它初始化 arr
。那看起来像
Fstring(const wchar_t temp*) : arr(new wchar_t[wcslen(temp) + 1])
{
size_t size = wcslen(temp);
for(int i = 0; i < size; i++)
arr[i] = temp[i];
arr[size] = L'[=10=]'
}
您还必须实现复制构造函数。有关原因的更多信息,请参阅 What is The Rule of Three?
请注意,您正在重新发明轮子。如果你想要一个宽字符串,你可以使用 std::wstring
它已经为你完成了所有这些。
我有一个名为 Fstring
的 class,里面有一个 wchar_t*
。
我写了以下内容来将字符串文字复制到 Fstring
:
#include <iostream>
using namespace std;
class Fstring{
wchar_t *arr;
public:
Fstring& operator = (const wchar_t temp[])
{
delete [] arr;
arr=new wchar_t[wcslen(temp)];
for(int i=0;i<=wcslen(temp);i++)
arr[i]=temp[i];
return *this;
}
};
int main()
{
Fstring test=L"Hello World";
return 0;
}
但是没有用。编译器给我以下错误:
error C2440: 'initializing' : cannot convert from 'const wchar_t [12]' to 'Fstring'
我真的很困惑,我用谷歌搜索 "Overloading operators" 但所有结果都与我过去重载运算符的方式相同。那么为什么这不起作用?
当您看到 Type name = initializer
时,它没有使用赋值运算符。它正在声明一个变量,因此正在初始化(技术上 copy-initialization 或 copy-list-initialization)。这意味着它调用构造函数。由于您没有采用 const wchar_t*
的构造函数,您将收到错误。
您需要实现一个接受 const wchar_t*
的构造函数并用它初始化 arr
。那看起来像
Fstring(const wchar_t temp*) : arr(new wchar_t[wcslen(temp) + 1])
{
size_t size = wcslen(temp);
for(int i = 0; i < size; i++)
arr[i] = temp[i];
arr[size] = L'[=10=]'
}
您还必须实现复制构造函数。有关原因的更多信息,请参阅 What is The Rule of Three?
请注意,您正在重新发明轮子。如果你想要一个宽字符串,你可以使用 std::wstring
它已经为你完成了所有这些。