Несколько вопросов о семантике декларации

Какие из них являются более правильными и более широко используемыми? На самом деле вопрос последний, я думаю, что поведение меняется.

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» в этой теме.

-1

Решение

Где вы размещаете пространство вокруг & или же * (или действительно, если у вас есть один или несколько пробелов с одной или обеих сторон), абсолютно не имеет значения. Размещение 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 * соответственно, и мы не можем изменить сам указатель — поэтому нет смысла передавать его по ссылке.

1

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

Все ваши примеры дают одинаковую семантику для каждой строки, кроме этих:

//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?
2

Во-первых, пробел не имеет значения технически, за исключением того, что он разделяет символы.

Тем не менее, вы не будете слишком далеко пытаться понять вещи, анализируя существующие декларации.

Вы должны начать с строительство деклараций.

И в этих конструкциях место const после всего, к чему это относится.

Общая идея C, к сожалению, хранящаяся в C ++, заключается в том, что объявление похоже на использование. Так что, если, скажем, выражение *p должен дать intто декларация p было бы int *p, Теперь скажем, что вместо выражений *p должен дать int constтогда декларация будет int const *p,

В C ++ акцент делается на типах, поэтому программист C ++, скорее всего, напишет это как

int const* p;

отделяя тип вещь от имени того, что объявлено.

Но помните, что пространство не имеет значения технически.

И благодаря такому способу создания объявлений с точки зрения предполагаемого использования, вы можете легко использовать компилятор C ++ для тестовое задание что ваша декларация работает, что она компилируется.

1

int *x а также int &x считаются лучшими. Зачем?
int* x, y может выглядеть как два указателя на int, но это один указатель и один int.
int *x, *y Синтаксис немного лучше — вы можете лучше видеть, что это два указателя.

Я знаю, что я не освещал вторую часть вашего вопроса;)

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