что лучше и как объявить const в функции переполнения стека

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

#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 const * _ex; указатель указывает только на Ex const. почему все выше в порядке?

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

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

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

0

Решение

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

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

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

0

Другие решения

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

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

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

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

  • Если данные не должны быть изменены: Ex const * ex; будет исполнять это.
  • Если указатель не должен быть изменен: Ex * const ex; будет исполнять это.
  • Если и указатель, и данные должны остаться нетронутыми: Ex const * const ex; Сделаю.
0

По вопросам рекламы [email protected]