Я наткнулся на следующий фрагмент кода в книге Марка Аллена Вайса о структурах данных.
template <class Object>
class Cref
{
public:
Cref ( ) : obj ( NULL ) { }
explicit Cref( const Object & x ) : obj ( &x ) {
const Object & get( ) const
{
if ( isNull( ) )
throw NullPointerException( ) ;
else
return *obj;
}
bool isNull( ) const
( return obj == NULL; }
private:
const Object *obj;
};
Итак, дело здесь в том, чтобы присвоить null/инициализировать постоянную ссылку. Но я не уверен, что понимаю следующее: 1. Мы инициализируем константную ссылку другой постоянной ссылкой x. Но почему это снова делается как obj(&x) ? & in const Object & x отличается от & x в obj (& x) ? Я это вижу, но не очень понимаю, почему так должно быть. Пожалуйста, объясните. 2. Метод get () — мы пытаемся вернуть константную ссылку на частный объект obj этого класса. Это уже константная ссылка. Зачем возвращать *obj, а не просто obj? 3. Почему явное ключевое слово? Что может произойти, если произойдет неявное преобразование типов? Может ли кто-нибудь предоставить сценарий для этого?
Спасибо
x
(и является константным, поскольку является константной ссылкой). Поэтому вы используетеx
точно так же, как и переменную этого типа. Чтобы получить указатель на переменную, вы используете оператор адреса,&
, и поэтому вы делаете то же самое сx
. Тот факт, что ссылка также определяется с помощью символа&
, логически не связан с этим. Было бы то же самое, если бы они решили использовать для этого ключевое словоref
. 13.11.2011