3

Пусть у меня есть класс «MyClass» -:C++: массив объектов класса с перегруженными Конструкторы

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 основной()':
| 47 | ошибка: нет соответствия фу nction для вызова 'MyClass :: MyClass (MyClass)'
| 47 | примечание: кандидаты:
| 36 | Примечание: MyClass :: MyClass (MyClass &)
| 36 | Примечание: не известно преобразование для аргумента 1 из 'MyClass' до 'MyClass &'
| 32 | Примечание: MyClass :: MyClass (интермедиат)
| 32 | Примечание: не известно преобразование для аргумента 1 из 'MyClass' до '' междунар

Но когда я удаляю конструктор копирования myclass(myclass &a) из класса, я не получаю никаких ошибок, и все работает нормально ...

Так что теперь мои вопросы -:

1). Почему это происходит?? Является ли myclass(int n=0) лучшим совпадением, чем конструктор копирования здесь?

2). Как успешно скомпилировать его, учитывая, что я хочу как конструктор копирования, так и целочисленный конструктор в моем классе?

Примечание: Я использую GCC версии 4.7.3 на Ubuntu 13.04

+1

Не должен ли конструктор копирования использовать 'const myclass & a'? – nvoigt

+0

@ nvoigt Оба являются законными, и есть редкие случаи (например, 'std :: auto_ptr'), где конструктор копирования принимает неконстантную ссылку.Но в целом: вы хотите иметь возможность копировать временные файлы (для которых требуется const ref), и вы не изменяете копируемый объект (так что вы можете использовать const ref). –

ответ

2

Инициализация семантики в этом случае является копией . Копирование инициализации формально преобразует аргумент , а затем копирует его. Преобразованный аргумент не является lvalue, поэтому он не может связываться с неконстантной ссылкой в ​​вашем конструкторе копии . Если вы не определяете конструктор копирования, , то компилятор определяет один для вас, который принимает ссылку const . Вы, конструктор копирования, должны также ссылаться на ссылку const , так как он не изменяет свой аргумент.

Обратите внимание, что компилятор разрешает оптимизировать копию . Но только если программа была бы законной, если бы она этого не сделала.

+0

Я бы проголосовал за это, но у меня недостаточно репутации. Я проголосую, как только получу. Спасибо за помощь в любом случае .. !! –

2

How to successfully compile it , considering I want both , the copy constructor as well as the integer constructor in my class?

Добавление const к опорному аргумента конструктор копирования исправляет эту проблему (если она имеет какое-то отношение.):

myclass(const myclass &a) : n(a.n) {} 

Demo on ideone.

+0

О да! Забыл, что «5» является значением const. Большое спасибо! –

+1

@AnmolSinghJaggi '5' имеет тип' int', а не 'int const'; это значение rvalue, поэтому не может быть квалифицированным. И '5' служит аргументом для' myclass (int) '. Это копия временного объекта, созданного 'myclass (int)', который терпит неудачу, если конструктор копирования принимает неконстантную ссылку. –

+0

@JamesKanze Вы правы! Но что вы подразумеваете под «cv-qualified» точно? –

 Смежные вопросы

  • Нет связанных вопросов^_^