Конструктор вызывался, когда оператор присваивания не реализован - PullRequest
0 голосов
/ 23 мая 2018

Я практикую реализацию класса 'String' (C ++) в Visual Studio 2015. У меня в классе 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 голосов
/ 23 мая 2018

Что в этом случае делает компилятор за занавесом?

Учитывая s="Hello World";,

  1. Создается временный String(неявно преобразуется) из "Hello World" через String::String(const char*).

  2. s назначается из временного через неявно объявленный оператор присвоения копии (String::operator=(const String&)).

Кстати, вы можете отметить String::String(const char*) explicit, чтобы запретить неявное преобразование, которое произошло на шаге 1.

...