operator =在我的自定义字符串类中无法正常工作

时间:2017-07-08 11:36:11

标签: c++ class constructor initialization explicit-conversion

我正在尝试使用std :: vector<创建自定义字符串类char>。

请查看下面的代码。

#include <iostream>
#include <vector>

class mString {

public:

    mString();
    explicit mString(const char *str);
    mString(const mString &str);

    mString operator=(const char *str);

private:

    typedef std::vector<char> vecChar;
    vecChar _vc;
};

inline mString::mString(){}
inline mString::mString(const char *str) {

    const vecChar::size_type size = strlen(str);
    _vc = vecChar(str, str + size);
}
inline mString::mString(const mString &str) {

    _vc = str._vc;
}

inline mString mString::operator=(const char *str) {

    const vecChar::size_type size = strlen(str);
    _vc = vecChar(str, str + size);
    return *this;
}

int main(int argc, const char * argv[]) {

    /* This works */
    mString a;
    a = "Hello World";

    /* Error : No viable conversion from 'const char[12]' to mString */
    mString b = "Hello World";

    return 0;
}

我不明白为什么'mString b =“Hello World”;'在'mString a时不起作用; a =“Hello World”;'作品。 为了使其有效,我需要做些什么?

提前谢谢!

1 个答案:

答案 0 :(得分:4)

这与赋值运算符没什么共同之处。

您声明了此构造函数

explicit mString(const char *str);

使用函数说明符explicit

因此在此声明中

mString b = "Hello World";

无法调用构造函数将字符串文字"Hello World"转换为mString类型的对象。

删除函数说明符explicit,声明将编译。

或者代替上面声明中的复制初始化,您可以使用直接初始化,如

mString b( "Hello World" );

所以在这个宣言中

mString b = "Hello World";

有使用的构造函数。但是在这个表达式声明中

a= "Hello World";

确实使用了赋值运算符。