2014-02-08 3 views
-1

В этом коде зачем положить & в const CVector & param ???Путаница в программе перегрузки оператора

мы можем использовать его как следовать

c = a + b; 
c = a.operator+ (b); 

во втором заявлении, b не CVector& типа, так вот почему я смущен.

// overloading operators example 

#include <iostream> 
using namespace std; 

class CVector { 
    public: 
    int x,y; 
    CVector() {}; 
    CVector (int a,int b) : x(a), y(b) {} 
    CVector operator + (const CVector&); 
}; 

CVector CVector::operator+ (const CVector& param) { 
    CVector temp; 
    temp.x = x + param.x; 
    temp.y = y + param.y; 
    return temp; 
} 

int main() { 
    CVector foo (3,1); 
    CVector bar (1,2); 
    CVector result; 
    result = foo + bar; 
    cout << result.x << ',' << result.y << '\n'; 
    return 0; 
} 
+0

Пожалуйста, прочитайте [элемент частотной перегрузки оператора] (http://stackoverflow.com/q/4421706/819272). – TemplateRex

ответ

2

Как вы не хотите, чтобы ваш операнд должен быть изменен с помощью операции, у вас есть два решения:

  1. Отправить копию объекта, так что оригинал остается нетронутой
  2. Отправить как ссылка const: ключевое слово const предотвращает изменение объекта, а ссылка позволяет передать объект без копии.
0

Вы используете ссылку, чтобы избежать копирования объекта и const, чтобы указать, что объект не будет изменен.

1

Причина, по которой вы не работаете (изменяете ее свойства) на втором векторе, вы просто читаете ее. Используя знак &, вы убедитесь, что он передается по ссылке, которая работает эффективно, если второй вектор представляет собой большую структуру данных, такую ​​как матрица 1000 * 1000.

+0

Эффективность - хороший момент. благодаря – Jianchen

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