Код (Text): class mas { ... mas operator+ (mas &a); mas operator= (mas &a); ... } При использованнии конструкций вида: Код (Text): a=b+c; Компилятор орет что типа не определенна функция operator= для аргумента [mas], обьясните это я глючу, или компилятор, почему я не могу передать обьект когда принимаю ссылку.
SPA, покажи реализации этих operation overloading. тебе для этого надо реализовать: Код (Text): mas operator+ (const mas&, const mas &);
Код (Text): class mas { int *m; int n; public: ... mas& operator= (const mas &a); mas operator+ (const mas &a); ... }; mas& mas::operator=(const mas &a) { if(this!=&a) { n = a.n; delete[] m; m = new int[a.n]; for(int i=0;i<n;i++) m[i]=a.m[i]; } return *this; } mas mas::operator+ (const mas &a) { int i; mas t(n+a.n); for(i=0;i<n;i++) t.m[i] = m[i]; for(i=0;i<a.n;i++) t.m[n+i] = a.m[i]; return t; } Это самый оптимальный вариант? Т.е. я пытался использовать ссылки везде где можно, но прога при этом работать должна при всех случаях. ЗЫ насамом деле мнебы не помешали комментарии как это работае, и т.п.
если ctor mas(int size) не explicit, то пройдет такой код: Код (Text): int main() { mas m(5), a(6); m = a + 5; } Так же имхо лучше использовать std::vector
censored Да понятно что лучше стандартный, но надо разобраться как что работает. Так как что работает, я понял что если использовать написанный мной код то получаеться так: Код (Text): x=y+z; Вызываем для y метод +, он вызывает конструктор создает новый обьект, потом копируем его во временный обьект, и передаем его ссылку на оператор = т.к. мы написали const то компилятор позволяет нам это сделать. Так вот у меня пара вопросов: 1. Я прав? 2. Почему нельзя использовать не константную ссылку.
имхо Код (Text): mas temp(y.n+z.n); // копирование эл-тов x.operator =(temp); temp.~mas(); смотря где, но семантика оператора сложения подрузумевает, что аргументы не меняются, поэтому лучше писать const
censored А смысл такого кода? Из `5` создастся массив с 5ю элементами и прибавится к `a`. Здесь имелось ввиду прибавление числа к каждому элементу массива? Тогда нужно реализовать `mas& operator+(mas& m, int a)`. Вообще, понятно, что это велосипеды и в STL есть всё необходимое, но всё же самостоятельная реализация даёт немного опыта и понимания языка
Смысл в том, чтобы лишить пользователя класса возможонсти совершать такие "хаки". Для этого к-тор надо объявлять explicit.
Код (Text): class C{ public: C& operator =(C& that){return *this;} }; int main(){C c,d; c = d;} Вполне даже можно, но противоречит логике по тому, как rvalue должно быть (по крайней мере сопровождающий программу будет так думать не изменяемым.
censored Нет вы недопонили ваш пример демонстрирует другое, вот так нельзя Код (Text): C operator =(C& that){return *this;} Смотрите первый листинг.
Код (Text): class C{ public: C operator =(C& that){return *this;} C operator +(C& that){return *this;} }; int main(){C a,c,d; a = c+d;} все компилируется. насколько это хорошо\плохо -- хз.
censored Из оператора + возвращаеться не this Код (Text): class C{ public: C operator =(C& that){return *this;} C operator +(C& that){C a; return a;} }; int main(){C a,c,d; a = c+d;} Вот так не компилиться! т.е. нельзя передать ссылку на временный обьект, хотя константную ссылку можно.
пример не совсем имха удачный, т.к. в этом классе нет ни одного члена данных. какой смысл тогда в operator+ и в operator= ?