Возможный дубликат:
Какова причина того, что копирование и прямая инициализация ведут себя по-разному?
И под инициализацией копирования я имею в виду так:
struct MyStruct
{
MyStruct(int) {}
MyStruct(const MyStruct&) {}
};
MyStruct s = 5; // needs *both* the int and copy constructor
Несмотря на долгие годы программирования на C ++, я так и не понял, что для приведенного выше кода требуется конструктор копирования (благодаря jogojapan). Времена всегда были исключены, и как таковой я даже не знал, что они вообще существуют (по крайней мере, на поверхностном уровне, несмотря на то, что они были оптимизированы), пока на меня не указали.
После приличного количества поисков в Google, я понимаю, как это работает. Мой вопрос Зачем так оно и есть?
Почему стандарт не сделал так, чтобы приведенный выше пример не нуждался в конструкторе копирования? Есть ли какой-то конкретный случай / пример, который показывает, что важно наличие конструктора копирования в этом типе инициализации?
Без достойного объяснения Зачем все они такие, какие есть, я просто рассматриваю это как раздражающий артефакт, но я бы предпочел не быть в неведении, если есть что-то важное, что я упускаю.
Копирование инициализации объекта неоднозначно для прямой инициализации, оба могут использоваться в одинаковой степени для того, чтобы установить значения, равные друг другу.
int a = 4;
int a = int(4);
int a(4);
все эти вызовы неоднозначны, все они установлены равными 4. Причиной для конструктора копирования в случае целого числа является удобство, представьте, что типы данных c ++ без этого
int a(foo(b,r)); //a little messy for a variable declaration
int a = foo(b,r) //ok, cleaner
Вы также можете использовать неявный и явный конструктор копирования, вот пример программы, которая явно использует конструктор копирования для обработки воображаемых чисел:
#include <iostream>
using std::cout;
using std::endl;
class complexNumbers {
double real, img;
public:
complexNumbers() : real(0), img(0) { }
complexNumbers(const complexNumbers& c) { real = c.real; img = c.img; }
explicit complexNumbers( double r, double i = 0.0) { real = r; img = i; }
friend void display(complexNumbers cx);
};
void display(complexNumbers cx){
cout<<"Real Part: "<<cx.real<<" Imag Part: "<<cx.img<<endl;
}
int main() {
complexNumbers one(1);
display(one);
complexNumbers two =2;
display(200);
return 0;
}
Других решений пока нет …