通过c ++中的赋值初始化自己的String类

时间:2015-09-02 08:53:53

标签: c++ string class

我正在用c ++编写我自己的字符串类StringEx(不用担心,只是为了练习)但是我没有通过为它指定一个字符串来创建我的类的实例:

StringEx string1 = StringEx("test"); // works fine
StringEx string2 = "test"; // doesn't work

string string3 = "test";
string1 = string3; // also works fine

我重载了赋值运算符,因此它可以处理std::string,但我必须首先创建一个StringEx的对象。

如何通过为其指定字符串来创建StringEx的新对象?甚至可以将每个"string"的c ++处理作为StringEx类的对象吗?

这是我的StringEx.h ,现在可以使用

#ifndef STRINGEX_H
#define STRINGEX_H


#include <iostream>
#include <string>
#include <vector>
using namespace std; //simplyfying for now

class StringEx
{
private:
    vector<char> text;
public:
    StringEx();
    StringEx(string);
    StringEx(const char*);  // had to add this
    StringEx(vector<char>);

    int size() const;
    int length() const;
    char at(int) const;

    void append(const string&);
    void append(const StringEx&);
    void append(const char*);  // had to add this

    StringEx operator+(const string&);
    StringEx operator+(const StringEx&);
    StringEx operator+(const char*);  // had to add this too

    StringEx operator=(const string&);
    StringEx operator=(const StringEx&);
    StringEx operator=(const char*);  // had to add this too

    StringEx operator+=(const string&);
    StringEx operator+=(const StringEx&);
    StringEx operator+=(const char*);  // had to add this too

    friend ostream& operator<<(ostream&, const StringEx&);
};

#endif // STRINGEX_H

3 个答案:

答案 0 :(得分:5)

一些准确性:

StringEx string1 = StringEx("test"); // works fine

这使用了复制构造函数,即StringEx(const StringEx& other);

StringEx string2 = "test"; // doesn't work

这会尝试使用具有以下签名的构造函数:StringEx(const char* str);

最后,这两行:

string string3 = "test";
string1 = string3; // also works fine

从标准库定义的std::string创建const char*,然后使用您似乎已正确定义的std::string重载的复制赋值运算符,即{{ 1}}。

这里的关键是这句话:

StringEx& operator=(const std::string& other)

不是一个分配,它是一个使用构造函数而不是复制赋值运算符的变量的声明和初始化。

在您的情况下,您只是错过了以Type myVar = something; 为参数的构造函数

答案 1 :(得分:2)

TLDR:如果需要2次“强制转换”,编译器将不会自动解决。在这种情况下,const char*std::stringStringEx

StringEx string1 = StringEx("test"); // works fine&gt;这会显式调用构造函数,因此只能进行一次转换:const char*std::string

StringEx string2 = "test"; // doesn't work&gt;另一方面,这一点尚不清楚。是否要将const char*转换为std::string并使用StringEx(const std::string&)构造函数或使用其他中间类?

您需要的是另一个接受const char*作为参数的构造函数。

BTW:

StringEx string4 = std::string("test"); //Also works

答案 2 :(得分:2)

我假设你有一个

形式的非显式构造函数
StringEx (const std::string&);

或类似。

字符串文字不是std::string类型。 "test"的类型为const char[5]std::string有一个非显式构造函数接受const char*,所以你的两个调用看起来像这样(不考虑复制省略):

//implicitly convert "test" to temporary std::string
//construct temporary StringEx with temporary std::string
//copy-construct StringEx with temporary
StringEx string1 = StringEx("test"); 

//no StringEx constructor taking const char*
//two conversions necessary to make "test" into a StringEx
//invalid
StringEx string2 = "test";

一个简单的解决方法是添加一个const char*StringEx的构造函数:

StringEx (const char*);

或者你可以使用直接初始化:

//only one conversion needed
StringEx string2 ("test");