Чтобы уточнить мои идеи, чтобы скопировать инициализацию и прямую инициализацию

Определите класс следующим образом:

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) все еще работает нормально.

Другие вопросы по тегам