что лучше и как объявить const в функции c++

у меня есть этот код

#include <iostream>
using namespace std;
class Ex;
class Exx;

class Ex {
public:
    int _val;
    int const *_p_val;
    void setPtrVal(int * const &val) {
        _p_val=val;
    }
};

class Exx {
public:
    Ex const *_ex;
    void setEx(Ex const &ex)
    {
        _ex=&ex;
    }
};

int main()
{
    Ex x;
    int i=10;
    x.setPtrVal(&i);
    Exx xx;
    xx.setEx(x);
    int y=20;
    cout<<*(xx._ex->_p_val)<<endl;
    x.setPtrVal(&y);
    cout<<*(xx._ex->_p_val)<<endl;
    cout<<*x._p_val<<endl;
    return 0;
}

1: как видите, Ex x не является константой Ex class. И Ex const *_ex; является указателем только на Ex const. почему все выше в порядке?

2: Является ли const в void setEx(Ex const &ex) просто означает, что вы не можете изменить ex в теле функции?

3: как исправить функцию установки для переменной указателя члена, если мне нужен прототип, как указано выше (предположительно, по соображениям безопасности)?

ХОРОШО. if Ex const *_ex; становится Ex *_ex; Итак, в функции установки я хочу, чтобы прототип не модифицировал объект аргумента, как указано выше. Как функционируют тела?


person quano1    schedule 23.08.2013    source источник
comment
Ваш вопрос не очень ясен   -  person davids    schedule 23.08.2013
comment
Ok. я обновил свой последний вопрос   -  person quano1    schedule 23.08.2013


Ответы (2)


  1. Указатель (или ссылка) на const не обязательно должен указывать на объект const. Это просто означает, что его нельзя использовать для изменения объекта, на который он указывает; поэтому он может безопасно указывать на объект const или не-4_.

  2. Да. В частности, это означает, что ссылка, переданная в качестве аргумента функции, не может использоваться для изменения объекта.

  3. Лучше включить const, если вам не нужно использовать его для модификации. Это предотвратит случайное изменение и позволит вам указать на const объектов.

person Mike Seymour    schedule 23.08.2013
comment
@quano1: Извините, я понятия не имею, что задает третий вопрос. - person Mike Seymour; 23.08.2013
comment
извините за мой настойчивый английский :D Я исправил, надеюсь, вы понимаете - person quano1; 23.08.2013

Во-первых, вы на самом деле правы, написание void setEx(Ex const &ex) означает, что внутри setEx параметр &ex является cv-квалифицированным.

Это не означает, что то, на что указывалось (или на что ссылались в вашем случае), обязательно было чем-то уже константным в вызывающем коде.

Затем перейдем к тому, что лучше, ну, это зависит от того, чего вы на самом деле хотите. Если вы пишете Ex const* ex; для своего члена, это означает, что после того, как он будет установлен при инициализации вашего объекта, сам объект (через свою функцию-член) не сможет изменить данные, указаны. Он по-прежнему может присвоить новое значение указателю (сделать так, чтобы он указывал в другом месте), но это означает, что он не может изменить то, на что он указывает.

Наконец, все сводится к тому, чего вы хотите.

  • Если данные не должны быть изменены: Ex const * ex; обеспечит это.
  • Если указатель не должен быть изменен: Ex * const ex; обеспечит это.
  • Если и указатель, и данные должны оставаться нетронутыми: подойдет Ex const * const ex;.
person JBL    schedule 23.08.2013