У меня есть этот код
#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; Итак, в функции сеттера я хочу, чтобы прототип не изменял объект аргумента, как описано выше. Как функции тела становятся?
Указатель (или ссылка) на const
не обязательно указывать на const
объект. Это просто означает, что его нельзя использовать для изменения объекта, на который он указывает; так что он может безопасно указать либо const
или неconst
объект.
Да. В частности, это означает, что ссылка, переданная в качестве аргумента функции, не может быть использована для изменения объекта.
Лучше включить const
если вам не нужно использовать его для модификации. Это предотвратит случайную модификацию и позволит вам указать на const
объекты.
Во-первых, вы на самом деле правы, пишите void setEx(Ex const &ex)
значит внутри setEx
параметр &ex
является cv-квалифицированным.
Это не означает, что то, на что указывает (или ссылается в вашем случае), обязательно должно быть чем-то неизменным в вызывающем коде.
Затем, на что лучше, ну, это зависит от того, что вы на самом деле хотите. Если ты пишешь Ex const* ex;
для вашего члена это означает, что, как только он установлен через инициализацию вашего объекта, сам объект (через свою функцию-член) не может изменять данные указал на. Он по-прежнему может назначать новое значение указателю (сделать его указателем в другом месте), но это означает, что он не может изменить то, на что указывает указатель.
Наконец, все сводится к тому, что вы хотите.
Ex const * ex;
будет исполнять это.Ex * const ex;
будет исполнять это.Ex const * const ex;
Сделаю.