2016-11-27 7 views
0

Я перехожу к основам перегруженных операторов, в частности оператора присваивания. Я пытаюсь понять, использование перегрузки в диктуя копию и переместить поведение после этого:Перегруженный оператор присваивания для операций копирования/перемещения?

operator overloading

Я нашел пример они дают весьма неясными.

Это базовый код, который я написал до сих пор, чтобы проиллюстрировать перегрузку. Как этот код можно редактировать, чтобы проиллюстрировать использование перегрузки при настройке копирования и перемещения?

class Distance 
{ 
public: 
    int feet, inches; 

    Distance() 
    { 
     feet = 0; 
     inches = 0; 
    } 

    Distance(int f, int i) 
    { 
     feet = f; 
     inches = i; 
    } 

    auto operator=(Distance &D)->void //Use operator to perform additional operation (adding 100) 
    { 
     feet = D.feet + 100; 
     inches = D.inches + 100; 
    } 
}; 

int main() 
{ 
    Distance D1; 
    D1.feet = 10; 
    D1.inches = 12; 
    Distance D2; 
    D2 = D1; 
    std::cout << D2.feet << std::endl; 
} 

ответ

-1

Вы не должны использовать такой оператор присваивания (даже если можете). Оператор присваивания с дополнительной операцией может использоваться, например, для подсчета количества заданий. Изменение данных таким образом приводит к путанице и человеческой ошибке во время использования интерфейса. Вы ожидаете, что код будет работать каким-то образом, в случае оператора присваивания он будет копировать значения. Просто следуйте тому, как работают встроенные типы и реализуют ваши перегруженные операторы. Вы не будете умножать объемы для оператора +(), правильно? Это не имеет никакого смысла.

Дополнительная операция в этом случае может быть, например:

static int assignmentCount = 0; 

auto operator=(Distance &D)->void 
    { 
    feet=D.feet; 
    inches=D.inches; 
    std::cout << "Made assignment"; //Just some debug stuff 
    assignmentCount++;    //Count assignments made 
    } 

Не забывайте, что вы поставили там пустота, как тип возвращаемого значения, который отключает вас сделать следующее D1 = D2 = D3, который может быть полезно в некоторых случаях. Возвращаемая ссылка на принимаемое значение является обычной практикой.

Я рекомендую читать Professional C++ от Марка Грегуара или одну из книг Stroupstrup. Мой недавний опыт заключается в том, что онлайн-источники могут привести к какой-то путанице, и книги, как правило, лучше изучают основы.

+1

Неужели все еще неясно, даже после прочтения? Или что именно вас беспокоит? – holmicz

+0

Для тех, кто этого не понимает, - опубликовал комментарий, в котором сообщалось, что Stroupstrup имеет целую главу о операторах присваивания, просто чтобы понять это. – holmicz