Чтобы уточнить мои идеи, чтобы скопировать инициализацию и прямую инициализацию
Определите класс следующим образом:
class A {
public:
A(): s("") {} //default constructor
A(const char* pStr): s(pStr) {} //constructor with parameter
A(const A& a) : s(a.s) {} //copy constructor
~A() {} //destructor
private:
std::string s;
};
Код ниже выполнит прямую инициализацию:
A a1("Hello!"); //direct initialization by calling constructor with parameter
A a2(a1); //direct initialization by calling copy constructor
И что последует выполнит инициализацию копии:
A a3 = a1;
A a4 = "Hello!";
Насколько я понимаю, A a4 = "Hello"
эквивалентно:
//create a temporary object first, then "copy" this temporary object into a4 by calling copy constructor
A temp("Hello!");
A a4(temp);
Так в чем же разница между A a3 = a1
а также A a2(a1)
? Кажется, они оба вызывают конструктор копирования. И правы ли мои комментарии выше? (без оптимизации компилятора)
1 ответ
Решение
Существует разница между прямой инициализацией и инициализацией копирования:
Инициализация копирования менее разрешительна, чем прямая инициализация: явные конструкторы не являются конвертирующими конструкторами и не рассматриваются для инициализации копирования.
Так что, если вы делаете конструктор копирования explicit
затем A a3 = a1
не сработает; в то время как A a2(a1)
все еще работает нормально.