C++中字符串的重载运算符

Mor*_*ade -2 c++ wchar-t operator-overloading assignment-operator

我有一个名为 的类Fstring,其中有一个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;
}
Run Code Online (Sandbox Code Playgroud)

但它没有用。编译器给了我以下错误:

错误 C2440:“正在初始化”:无法从“const wchar_t [12]”转换为“Fstring”

我真的很困惑,我在谷歌上搜索了“重载运算符”,但所有结果都与我用来重载运算符的方式相同。那么为什么这不起作用呢?

Nat*_*ica 5

当您看到Type name = initializer它不使用赋值运算符时。它声明了一个变量,因此是初始化(技术上来说是copy-initializationcopy-list-initialization)。这意味着它调用了一个构造函数。由于您没有接受 a 的构造函数,因此const wchar_t*您将收到错误消息。

你需要的是实现一个构造函数,它接受 aconst 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'\0'
}
Run Code Online (Sandbox Code Playgroud)

您还必须实现一个复制构造函数。有关为什么的更多信息,请参阅什么是三的规则?


请注意,您正在重新发明轮子。如果你想要一个宽字符串,你可以使用std::wstring它已经为你完成了所有这些。