Предположим, у меня есть класс «myclass» -:
class myclass
{
public:
int n;
myclass(int n=0)
{
this->n=n;
}
myclass(myclass &a)
{
this->n=a.n;
}
~myclass()
{
cout<<n<<"\n";
}
};
Теперь я хочу создать массив объектов «myclass» следующим образом:
int main()
{
myclass arr[]= {5}; // Only 1 element for simplicity...
}
Но когда я делаю это, я получаю следующую ошибку -:
В функции int main ():
| 47 | ошибка: нет подходящей функции для вызова myclass :: myclass (myclass) ’
| 47 | Примечание: кандидаты:
| 36 | Примечание: myclass :: myclass (myclass&)
| 36 | примечание: нет известного преобразования для аргумента 1 из «myclass» в «myclass»&»
| 32 | примечание: myclass :: myclass (int)
| 32 | примечание: нет известного преобразования для аргумента 1 из «myclass» в «int»
Но когда я удаляю конструктор копирования myclass(myclass &a)
из класса я не получаю никаких ошибок, и все работает нормально …
Итак, теперь мои вопросы —
1). Почему это происходит?? не myclass(int n=0)
лучшее совпадение, чем конструктор копирования здесь ??
2). Как успешно скомпилировать его, учитывая, что я хочу и конструктор копирования, и целочисленный конструктор в моем классе ??
ПРИМЕЧАНИЕ: я использую GCC версии 4.7.3 в Ubuntu 13.04 (если это имеет какое-либо отношение.)
Семантика инициализации в этом случае является копией
инициализация. Копия инициализации формально преобразует
аргументация, то копирует его. Преобразованный аргумент не является
lvalue, поэтому он не может связываться с неконстантной ссылкой в вашем
Копировать конструктор. Если вы не определите конструктор копирования,
компилятор определяет один для вас, который принимает const
ссылка. Вы конструктор копирования должен взять констант
ссылка, так как он не изменяет свой аргумент.
Обратите внимание, что компилятору разрешено оптимизировать копию
строительство. Но только если программа будет легальной, если она
не сделал.
Как успешно скомпилировать его, учитывая, что мне нужен как конструктор копирования, так и конструктор целых чисел в моем классе?
Добавление const
к ссылочному аргументу конструктора копирования исправляет эту проблему:
myclass(const myclass &a) : n(a.n) {}