Какие из них являются более правильными и более широко используемыми? На самом деле вопрос последний, я думаю, что поведение меняется.
int *test; //for this, it is probably both?
int* test;int& test;
int &test;
Актуальный вопрос:
const int test;
int const test;const int* test;
int* const test; //<-- I guess this also have a different meaning if I consider the last one?const int& test;
int const& test; //also, considering last one, any difference?const int*& test;
int* const& test; //<-- this is the correct one for stating "I won't modify the passed object, but I may modify the one pointed"? I have had problems with the other one sometimes, does the other one has some other meaning?
const int* const& test; //<-- another meaning?
Также я был бы рад, если бы вы могли указать, если вы знаете какой-либо визуальный «ambiguations» в этой теме.
Где вы размещаете пространство вокруг &
или же *
(или действительно, если у вас есть один или несколько пробелов с одной или обеих сторон), абсолютно не имеет значения. Размещение const
действительно имеет значение;
const int *test;
значит что test
указывает на не меняется. Так:
int b = 42;
*test = 42;
test = &b;
*test = 42;
будет незаконным, но назначение теста на новый адрес является действительным.
int * const test;
Значит это test
не может изменить его значение, но то, на что он указывает, может:
int b = 42;
*test = 42;
test = &b;
сейчас test = &b;
является недействительным.
const int& test;
int const& test; //also, considering last one, any difference?
Оба одинаковые. Const и int — это одна и та же сторона &
,
Вот этот:
const int*& test;
означает, что у нас есть ссылка на int *
где значение не может быть изменено. Совершенно верно, мы можем использовать следующее:
test = &b;
эти двое:
int* const& test
const int* const& test;
это ссылка на int *
а также const int *
соответственно, и мы не можем изменить сам указатель — поэтому нет смысла передавать его по ссылке.
Все ваши примеры дают одинаковую семантику для каждой строки, кроме этих:
//test is a pointer to a const int.
//test may be modified, but the int
//that it points to may not (through this
//access path).
const int* test;
//test is a const pointer to int.
//test may not be modified, but the
//int that it points to may.
int* const test;//test is a reference to a pointer to a const int.
//The referenced pointer may be modified, but
//the int that that pointer points to may not be.
const int*& test;
//test is a reference to a const pointer to
//int. The referenced pointer may not be modified
//but the int may be.
int* const& test; //<-- this is the correct one for stating
// "I won't modify the passed object,
// but I may modify the one pointed"?
// Yes
// I have had problems with the other one sometimes,
// does the other one has some other meaning?
// Yes
//test is a reference to a const pointer to const int.
//The referenced pointer may not be modified, nor may
//the int that it points to.
const int* const& test; //<-- another meaning?
Во-первых, пробел не имеет значения технически, за исключением того, что он разделяет символы.
Тем не менее, вы не будете слишком далеко пытаться понять вещи, анализируя существующие декларации.
Вы должны начать с строительство деклараций.
И в этих конструкциях место const
после всего, к чему это относится.
Общая идея C, к сожалению, хранящаяся в C ++, заключается в том, что объявление похоже на использование. Так что, если, скажем, выражение *p
должен дать int
то декларация p
было бы int *p
, Теперь скажем, что вместо выражений *p
должен дать int const
тогда декларация будет int const *p
,
В C ++ акцент делается на типах, поэтому программист C ++, скорее всего, напишет это как
int const* p;
отделяя тип вещь от имени того, что объявлено.
Но помните, что пространство не имеет значения технически.
И благодаря такому способу создания объявлений с точки зрения предполагаемого использования, вы можете легко использовать компилятор C ++ для тестовое задание что ваша декларация работает, что она компилируется.
int *x
а также int &x
считаются лучшими. Зачем?
int* x, y
может выглядеть как два указателя на int, но это один указатель и один int.
int *x, *y
Синтаксис немного лучше — вы можете лучше видеть, что это два указателя.
Я знаю, что я не освещал вторую часть вашего вопроса;)