在未实现赋值运算符时调用构造函数

时间:2018-05-23 08:34:02

标签: c++ copy-constructor assignment-operator

我正在练习' String' Visual Studio 2015中的类实现(C ++)。 我班上有3个构造函数,而不是任何赋值运算符。

String();
String(char _c);
String(const char* _pc);

main()中,我故意使用赋值运算符来检查代码的行为。

令我惊讶的是,它没有给出任何错误,并使用构造函数String(const char* _pc)为对象赋值。 此外,在范围的最后,它调用析构函数两次。

在这种情况下,编辑器在幕后做什么?为什么?

这是我的代码:

class String {
    private:
        int capacity;
        char* start;

    public:
        //Constructors
        String();
        String(const char* _pc);

        //Destructor
        ~String();
}

String::String() :start(nullptr), capacity(0) {}

String::String(const char* _pc) :capacity(1) {
    const char* buffer = _pc;

    while (*(buffer++))
        capacity++;

    int temp_capacity = capacity;
    if (temp_capacity)
        start = new char[temp_capacity];

    while (temp_capacity--) {
        start[temp_capacity] = *(--buffer);
    }
}

String::~String() {
    if (capacity == 1)
        delete start;
    if (capacity > 1)
        delete[] start;
}

int main() {
    String s;
    s="Hello World";
    return 0;
}

1 个答案:

答案 0 :(得分:6)

  

在这种情况下,编辑器在幕后做什么?

给定s="Hello World";

  1. String通过"Hello World"构建(隐式转换)临时String::String(const char*)

  2. s是从临时点implicitly-declared copy assignment operatorString::operator=(const String&))分配的。

  3. 顺便说一下,您可以标记String::String(const char*) explicit以禁止在步骤1发生的隐式转换。