2014-02-06 3 views
0

Я пытаюсь реализовать конструктор копирования и перегруженный конструктор назначения. У меня есть класс Employee, в котором есть три элемента данных. 1-name 2-title 3-зарплата.Оператор копирования или оператор присваивания? Что мне не хватает?

Employee::Employee(const Employee &emp) 
{ 
    name = emp.name; 
    title = emp.title; 
    salary = emp.salary; 
    cout << "\nOverloaded copy constructor called\n"; 
} 
Employee Employee::operator = (const Employee &emp) //Overloading the assignment operator. 
{ 
    name = emp.name; 
    title = emp.title; 
    salary = emp.salary; 
    cout << "\nOverloaded assignment operator called\n"; 
    return emp;   //Or return *this. 
} 

Вот что я не понимаю:
1- я не попал на «это» указатель. Если мой перегруженный оператор присваивания возвращает * этот или объект emp. Поскольку мне кажется, что этот объект в параметре является объектом правой руки при назначении. Поэтому я не должен возвращать объект левой руки с * this (если это то, что * это будет делать)?
2- В основной функции я попытался позвонить для вызова оператора присваивания сначала и конструктора копирования после этого. Таким образом, я ожидал, что я буду видеть заявление COUT я включил там один за другим, однако, Вот мой результат:

Перегруженного конструктор копирования называется
Перегруженного оператор присваивания называется
Перегруженного конструктора копирования называется
перегруженной копия конструктор под названием

Почему это происходит?

3-Должен ли я передавать объекты с помощью const? Из книги, которую я изучаю, нет.

В основном я просто написал

Employee x; 
x = another; 
Employee y = x; 

«другой» это просто (плохо назван) объект Employee Я инициализируется раньше в моем коде.
Так должен не первое задание выходного
«перегружено задание называется» и второе назначение (не назначение, но копия по моему пониманию) выход «Перегруженный конструктор копирования называется»

+0

Для номера 2 и 3 - Покажите нам код, связанный с этим. – 0x499602D2

ответ

3

Уступка оператор обычно реализуется как

Employee& Employee::operator = (const Employee &emp) 
{ 
    name = emp.name; 
    title = emp.title; 
    salary = emp.salary; 
    cout << "\nOverloaded assignment operator called\n"; 
    return *this;  
} 

Обратите внимание на разницу в обратном типе в качестве ссылки. Вы можете найти этот вопрос/ответ полезным Why must the copy assignment operator return a reference/const reference?. Не видя кода, на который вы ссылаетесь в своей функции main(), мы будем только гадать, что происходит в вашем коде.

0

1- У меня нет указателя «этого». Если мой перегруженный оператор присваивания возвращает * этот или объект emp. Потому что кажется мне, что этот объект в параметре является правым объектом на заданием. Поэтому я не должен возвращать объект левой руки с * это (если это то, что * это будет делать)?

Вы должны вернуть *this.

Заметим также, что сначала вы должны проверить против самостоятельного задания и возвращать ссылку:

Employee& Employee::operator = (const Employee &emp) //Overloading the assignment operator. 
{ 
    if (this != &emp) 
    { 
     name = emp.name; 
     title = emp.title; 
     salary = emp.salary; 
    } 
    cout << "\nOverloaded assignment operator called\n"; 
    return *this; 
} 

Here you can find how to write assignment operator.

2- На основной функции, я пытался позвонить, чтобы вызвать назначение сначала оператор и конструктор копирования. Так что я ожидал , что я буду видеть заявление COUT я включил там один за другой, однако

Пожалуйста, вставьте этот код из main() так что мы можем сказать вам больше.

+0

Я видел это, если заявление в других вопросах здесь, но я не понимал необходимости. Что вы подразумеваете под самоназванием? – Mustafa

+0

Сотрудник e; е = е; Здесь это явно, поэтому выглядит маловероятным, однако вы можете сделать что-то подобное по ошибке при обработке объектов в алгоритмах и структурах. – 4pie0

+0

Я изменил свой оператор назначения. Но у меня ошибка, когда в выражении if (что-то о! = Не соответствует операндам), поэтому я изменил оператор if на if (this! = & Emp), и я вернул * это. Но теперь мой вывод - это перегруженный конструктор копирования, называемый Перегруженный оператор присваивания, называемый . Перегруженный конструктор копий с именем – Mustafa

0

Отредактировано: Давайте конструктор копирования, чтобы сделать все для вас

Employee::Employee(const Employee &emp) 
{ 
    if(this != &emp) 
    { 
     name = emp.name; 
     title = emp.title; 
     salary = emp.salary; 
    } 

    cout << "\nOverloaded copy constructor called\n"; 
} 
Employee Employee::operator = (const Employee &emp) //Overloading the assignment . 
{  
    return emp; //Having common assignment operations similar to copy constructor 
} 
+1

Вы возвращаете ссылку на локальную переменную, которая является плохим, поскольку 'temp' будет разрушен и недействителен ссылка. Ваш код также не изменяет 'this' и не возвращает' * this' (что является поведением 'operator =' по умолчанию) –

+0

отредактировал ответ – Varo

0
  1. перегруженный оператор присваивания должен возвращать * этот указатель. Вы можете реализовать частный метод, который бы скопировал члены класса и просто вызвал его из оператора конструктора/назначения копии, что приведет к уменьшению дублирования кода.

    void Employee::copy(const A& rhs) throw() 
    { 
        name = rhs.name; 
        title = rhs.title; 
        salary = rhs.salary; 
    } 
    
    Employee::Employee(const Employee& rhs) 
    { 
        copy(rhs); 
        // cout << "copy constructor" << endl; 
    } 
    
    Employee& operator=(const Employee& rhs) 
    { 
        copy(rhs); 
        // cout << "assignment operator" << endl; 
        return *this; 
    } 
    
  2. Ваша реализация оператора присваивания делает возвращает объект Employee по значению (оно должно быть в качестве ссылки), так как эффект временные объекты создаются путем вызова копирования с-Tor.

    Overloaded copy constructor called // don't know where this printout comes from as I don't know what happens with 'another' object 
    Overloaded assignment operator called // x = another; call 
    Overloaded copy constructor called // the temporary object created by assignment operator's return statement (*this should be returned by reference not by value) 
    Overloaded copy constructor called // Employee y = x; cal 
    
  3. Вы всегда должны передать входные параметры как константы, если вы не намерены изменять их. Я полагаю, вы спрашиваете о передаче объектов Employee в качестве ссылок на const в операторе присваивания и т. Д.? - они должны быть константными ссылками

Немного больше о безопасности исключений и само присвоении обработки в операторе присваивания: GotW 59 и GotW 23

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