Ниже приведена часть из раздела 13.1.1. из книги «C++ Prime», 5-е издание:Как понять различия между прямой инициализацией и инициализацией копирования
Для проверки вышеуказанного пункта, особенно в заявлении подчеркнуто красным, я написал следующие коды:
#include<iostream>
using namespace std;
class TestClass {
public:
TestClass() :a(7) {
cout << "Default constructor";
}
TestClass(int aa) : a(aa) {
cout << "Constructor" << endl;
}
TestClass(const TestClass & t): a(t.a) {
cout << "Copy constructor" << endl;
}
TestClass & operator=(const TestClass & rhs) {
a = rhs.a;
return *this;
}
int a;
};
int main() {
TestClass t1(1);
TestClass t2 = t1;
}
Основываясь на моем понимании описание инициализации копии в книге, код должен сначала создать t2
с использованием инициализатора по умолчанию, а затем использовать функцию operator=
для копирования правого операнда t1
. Но когда я отлаживаю строку за строкой в Visual Studio 2015, код переходит прямо к конструктору копирования TestClass(const TestClass & t)
. Это показывает, что прямая инициализация и инициализация копий на самом деле делают то же самое, без разницы. Итак, мое понимание ошибочно или книга неверна? Если я ошибаюсь, то каково правильное понимание разницы между прямой инициализацией и инициализацией копии? Не могли бы вы дать мне пример кода, чтобы показать такую разницу? Большое спасибо.
Редактировать: кто-то говорит, что на мой вопрос может быть дан ответ в this thread. Но эта нить - это только (подробное и удлиненное) повторение текста, который я выдернул. Он не отвечает, почему на практике (например, Visual Studio 2015) это неверно.
http://stackoverflow.com/questions/1051379/is-there-a-difference-in-c-between-copy-initialization-and-direct-initialization – cpplearner