Константный указатель или ссылка

Тема в разделе "LANGS.C", создана пользователем spa, 1 ноя 2007.

  1. spa

    spa Active Member

    Публикаций:
    0
    Регистрация:
    9 мар 2005
    Сообщения:
    2.240
    Код (Text):
    1. class mas {
    2. ...
    3. mas operator+ (mas &a);
    4. mas operator= (mas &a);
    5. ...
    6. }
    При использованнии конструкций вида:
    Код (Text):
    1. a=b+c;
    Компилятор орет что типа не определенна функция operator= для аргумента [mas], обьясните это я глючу, или компилятор, почему я не могу передать обьект когда принимаю ссылку.
     
  2. varnie

    varnie New Member

    Публикаций:
    0
    Регистрация:
    2 янв 2005
    Сообщения:
    1.785
    SPA,
    покажи реализации этих operation overloading.

    тебе для этого надо реализовать:
    Код (Text):
    1. mas operator+ (const mas&, const mas &);
     
  3. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    varnie
    Это если вне класса.

    SPA
    Если аргумент не изменяется, то описывай его как const.
     
  4. spa

    spa Active Member

    Публикаций:
    0
    Регистрация:
    9 мар 2005
    Сообщения:
    2.240
    Код (Text):
    1. class mas
    2. {
    3.         int *m;
    4.         int n;
    5. public:
    6. ...
    7. mas&     operator=  (const mas &a);
    8. mas       operator+  (const mas &a);
    9. ...
    10. };
    11. mas&    mas::operator=(const mas &a)
    12. {
    13. if(this!=&a)
    14. {
    15. n = a.n;
    16. delete[] m;
    17. m = new int[a.n];
    18. for(int i=0;i<n;i++) m[i]=a.m[i];
    19. }
    20. return *this;
    21. }
    22.  
    23. mas    mas::operator+ (const mas &a)
    24. {
    25. int i;
    26. mas t(n+a.n);
    27. for(i=0;i<n;i++) t.m[i] = m[i];
    28. for(i=0;i<a.n;i++) t.m[n+i] = a.m[i];
    29. return t;
    30. }
    Это самый оптимальный вариант? Т.е. я пытался использовать ссылки везде где можно, но прога при этом работать должна при всех случаях.


    ЗЫ насамом деле мнебы не помешали комментарии как это работае, и т.п.
     
  5. censored

    censored New Member

    Публикаций:
    0
    Регистрация:
    5 июл 2005
    Сообщения:
    1.615
    Адрес:
    деревня "Анонимные Прокси"
    если ctor mas(int size) не explicit, то пройдет такой код:
    Код (Text):
    1. int main() { mas m(5), a(6); m = a + 5; }
    Так же имхо лучше использовать std::vector
     
  6. spa

    spa Active Member

    Публикаций:
    0
    Регистрация:
    9 мар 2005
    Сообщения:
    2.240
    censored
    Да понятно что лучше стандартный, но надо разобраться как что работает.
    Так как что работает, я понял что если использовать написанный мной код то получаеться так:
    Код (Text):
    1. x=y+z;
    Вызываем для y метод +, он вызывает конструктор создает новый обьект, потом копируем его во временный обьект, и передаем его ссылку на оператор = т.к. мы написали const то компилятор позволяет нам это сделать. Так вот у меня пара вопросов:
    1. Я прав? :)
    2. Почему нельзя использовать не константную ссылку.
     
  7. censored

    censored New Member

    Публикаций:
    0
    Регистрация:
    5 июл 2005
    Сообщения:
    1.615
    Адрес:
    деревня "Анонимные Прокси"
    имхо
    Код (Text):
    1. mas temp(y.n+z.n);
    2. // копирование эл-тов
    3. x.operator =(temp);
    4. temp.~mas();
    смотря где, но семантика оператора сложения подрузумевает, что аргументы не меняются, поэтому лучше писать const :)
     
  8. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    censored
    А смысл такого кода? Из `5` создастся массив с 5ю элементами и прибавится к `a`.

    Здесь имелось ввиду прибавление числа к каждому элементу массива? Тогда нужно реализовать `mas& operator+(mas& m, int a)`.

    Вообще, понятно, что это велосипеды и в STL есть всё необходимое, но всё же самостоятельная реализация даёт немного опыта и понимания языка :)
     
  9. censored

    censored New Member

    Публикаций:
    0
    Регистрация:
    5 июл 2005
    Сообщения:
    1.615
    Адрес:
    деревня "Анонимные Прокси"
    Смысл в том, чтобы лишить пользователя класса возможонсти совершать такие "хаки". Для этого к-тор надо объявлять explicit.
     
  10. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    censored
    А, я не в том контексте прочёл. Ты советуешь explicit.
     
  11. spa

    spa Active Member

    Публикаций:
    0
    Регистрация:
    9 мар 2005
    Сообщения:
    2.240
    Почему нельзя использовать не константную ссылку в операторе =
     
  12. censored

    censored New Member

    Публикаций:
    0
    Регистрация:
    5 июл 2005
    Сообщения:
    1.615
    Адрес:
    деревня "Анонимные Прокси"
    Код (Text):
    1. class C{
    2. public:
    3.   C& operator =(C& that){return *this;}
    4. };
    5.  
    6. int main(){C c,d; c = d;}
    Вполне даже можно, но противоречит логике по тому, как rvalue должно быть (по крайней мере сопровождающий программу будет так думать ;) не изменяемым.
     
  13. spa

    spa Active Member

    Публикаций:
    0
    Регистрация:
    9 мар 2005
    Сообщения:
    2.240
    censored
    Нет вы недопонили ваш пример демонстрирует другое, вот так нельзя
    Код (Text):
    1. C operator =(C& that){return *this;}
    Смотрите первый листинг.
     
  14. censored

    censored New Member

    Публикаций:
    0
    Регистрация:
    5 июл 2005
    Сообщения:
    1.615
    Адрес:
    деревня "Анонимные Прокси"
    Код (Text):
    1. class C{
    2. public:
    3.   C operator =(C& that){return *this;}
    4.   C operator +(C& that){return *this;}
    5. };
    6.  
    7. int main(){C a,c,d; a = c+d;}
    все компилируется. насколько это хорошо\плохо -- хз.
     
  15. spa

    spa Active Member

    Публикаций:
    0
    Регистрация:
    9 мар 2005
    Сообщения:
    2.240
    censored
    Из оператора + возвращаеться не this
    Код (Text):
    1. class C{
    2. public:
    3.   C operator =(C& that){return *this;}
    4.   C operator +(C& that){C a; return a;}
    5. };
    6.  
    7. int main(){C a,c,d; a = c+d;}
    Вот так не компилиться! т.е. нельзя передать ссылку на временный обьект, хотя константную ссылку можно.
     
  16. censored

    censored New Member

    Публикаций:
    0
    Регистрация:
    5 июл 2005
    Сообщения:
    1.615
    Адрес:
    деревня "Анонимные Прокси"
    А что стандарт говорит по этому поводу? Надо там смотреть.
     
  17. varnie

    varnie New Member

    Публикаций:
    0
    Регистрация:
    2 янв 2005
    Сообщения:
    1.785
    пример не совсем имха удачный, т.к. в этом классе нет ни одного члена данных. какой смысл тогда в operator+ и в operator= ?