Ответ на вопрос 1:
Однако кажется, что это невозможно, потому что они [ссылки] не могут быть объявлены неинициализированными (верно?).
правый.
Ответ на вопрос 2:
В моем фрагменте bar1 автоматически
инстанцируется по умолчанию
конструктор (чего я не хочу),
& bar2 вызывает ошибку компилятора, потому что
Вы не можете использовать неинициализированные ссылки
(Правильно?),
Вы инициализируете ссылки вашего класса в списке инициализатора вашего конструктора:
class Foo
{
public:
Foo(Bar &rBar) : bar2(rBar), bar3(NULL)
{
}
Bar bar1;
Bar &bar2;
Bar *bar3;
}
Ответ на вопрос 3:
В конкретном сценарии я работаю
прямо сейчас, я не хочу использовать
нормальные переменные (что правильно
срок для них кстати?)
Для них нет правильного названия, обычно вы можете просто указывать указатели для большинства обсуждений (кроме этого), и все, что вам нужно обсудить, будет также применяться к ссылкам. Вы инициализируете не указатель, не ссылочный элемент тем же способом через список инициализатора.
class Foo
{
public:
Foo() : x(0), y(4)
{
}
int x, y;
};
Ответ на вопрос 4:
указатели могут быть объявлены неинициализированными
(кстати, это лучшая практика для
установить значение NULL?).
Они могут быть объявлены неинициализированными, да. Лучше инициализировать их как NULL, потому что тогда вы можете проверить, действительны ли они.
int *p = NULL;
//...
//Later in code
if(p)
{
//Do something with p
}
Ответ на вопрос 5:
Похоже, я должен использовать указатели
в этом случае это правда? Также,
Каков наилучший способ использования
переменная
Вы можете использовать либо указатели, либо ссылки, но ссылки не могут быть переназначены и ссылки не могут быть NULL. Указатель такой же, как и любая другая переменная, например, int, но он содержит адрес памяти. Массив - это псевдоним для другой переменной.
Указатель имеет свой собственный адрес памяти, тогда как массив должен рассматриваться как разделяющий адрес переменной, на которую он ссылается.
Со ссылкой, после того, как она инициализирована и объявлена, вы используете ее так же, как если бы вы использовали переменную, на которую она ссылается. Там нет специального синтаксиса.
С указателем, чтобы получить доступ к значению по адресу, который он содержит, вам нужно dereference
указатель. Вы делаете это, помещая * перед этим.
int x=0;
int *p = &x;//p holds the address of x
int &r(x);//r is a reference to x
//From this point *p == r == x
*p = 3;//change x to 3
r = 4;//change x to 4
//Up until now
int y=0;
p = &y;//p now holds the address of y instead.
Ответ на вопрос 6:
А как насчет умных указателей и т. Д.? Является
это актуально?
Умные указатели (см. Boost :: shared_ptr) используются для того, чтобы при выделении в куче вам не нужно было вручную освобождать вашу память. Ни один из приведенных выше примеров не размещен в куче. Вот пример, где использование умных указателей помогло бы.
void createANewFooAndCallOneOfItsMethods(Bar &bar)
{
Foo *p = new Foo(bar);
p->f();
//The memory for p is never freed here, but if you would have used a smart pointer then it would have been freed here.
}
Ответ на вопрос 7:
Обновление 1:
После попытки реализовать
поле ссылочной переменной в моем классе
и инициализировать его в
конструктор, почему я могу получить
следующая ошибка?
Проблема в том, что вы не указали список инициализаторов. Смотрите мой ответ на вопрос 2 выше. Все после двоеточия:
class VTexture
{
public:
VTexture(vimrid::imaging::ImageMatrix &rImage)
: image(rImage)
{
}
private:
vimrid::imaging::ImageMatrix ℑ
}