Подтвердить что ты не робот

Амперсанд (&) в конце переменной и т.д.

Я С++ noob, и у меня проблема с пониманием синтаксиса С++ в коде. Теперь я совершенно смущен.

class date
{
private:
int day, month, year;
int correct_date( void );
public:
void set_date( int d, int m, int y );
void actual( void );
void print( void );
void inc( void );
friend int date_ok( const date& );
};

Что касается '&' характер, я понимаю его общее использование в качестве справочного, адресного и логического оператора...

например, int * Y = & X

В чем смысл оператора и в конце параметра?

friend int date_ok( const date& );

Спасибо

изменить

Спасибо за ответы. Если я правильно понял это, имя переменной просто было опущено, потому что это просто прототип. Для прототипа мне не нужно имя переменной, оно необязательно. Это правильно?

Однако для определения функции мне определенно нужно имя переменной, правильно?

4b9b3361

Ответ 1

const date& принимается методом date_ok означает, что date_ok принимает ссылку типа const date. Он работает аналогично указателям, за исключением того, что синтаксис немного более.. сладкий

в вашем примере int* Y = &x делает Y указателем типа int * а затем назначает ему адрес x. И когда я хотел бы изменить значение "что бы это ни было по адресу, указанному Y ", я говорю *Y = 200;

так,

int x = 300;
int *Y = &x;
*Y = 200; // now x = 200
cout << x; // prints 200

Вместо этого сейчас я использую ссылку

int x = 300;
int& Y = x;
Y = 200; // now x = 200
cout << x; // prints 200

Ответ 2

В этом контексте & не является оператором. Это часть типа.

Для любого заданного типа T тип T& является ссылкой на T ".

Символ & фактически имеет три значения в С++, и важно распознать эти разные значения.

  • "адрес" при применении к выражению
  • "ссылка", когда часть типа
  • "побитовое И" при применении к двум номерам

Аналогично, * имеет как минимум три значения, и как только вы их поймете, у вас будут указатели и ссылки вниз.: -)

Если я понял это правильно, имя переменной просто было опущено там, потому что это всего лишь прототип. И для прототипа мне не нужно имя переменной, оно необязательно. Это правильно?

Да.

Однако, для определения функции мне обязательно нужно имя переменной, правильно?

Нет. Хотя вы, как правило, этого хотите (в противном случае, что точка?!) есть некоторые обстоятельства, в которых вы этого не делаете, обычно, когда вы только вводили параметр для участия в обмане, связанном с перегрузкой.

Но, говоря чисто технически, вы можете опустить имя аргумента из декларации и/или определения по своему желанию.

Ответ 3

Итак, для начала, я думаю, вы можете быть более смущены тем, что автор этого кода пропустил что-то очень важное (хотя и необязательное): имя переменной.

Перепишите, что:

friend int date_ok( const date& check);

Тип переменной 'check' равен const date&. Мы передаем его функции как "постоянную ссылку". Другими словами, это псевдоним того, что мы прошли (через магию указателей), но мы не можем его изменить.

Причина, по которой мы это делаем, заключается в том, что мы можем передавать большие объекты (например, std::vector) в функции, не делая их копии. Передача по значению приводит к операции копирования. Для int это не имеет значения (требуется почти незанятое время), для класса это может быть более значительным. Эмпирическое правило - всегда передавать объекты по ссылке и передавать их по ссылке const, если вы не собираетесь их изменять. (Это эмпирическое правило игнорирует семантику перемещения, но я предполагаю, что вы еще не знаете об этом).

Ответ 4

используя и в конце типа в прототипе функции, позволяет передавать по ссылке вместо передачи по значению (копировать). Таким образом вы можете изменить объект даты в функции друга.

friend int date_ok( const date& );

Друг: В вашем определении класса это означает, что вы говорите, что функция date_ok может иметь доступ ко всем параметрам вашего класса. На деле это означает, что он почти является членом вашего класса, поэтому рассмотрите возможность добавления этой функции друга скорее как функцию-член. (если у вас нет других хороших причин, например, не загрязняя ваш класс внешними определениями)

Если да, то также подумайте о том, чтобы сделать статическую функцию, она может иметь одинаковый доступ к кишкам вашего класса объектов даты. Но это было бы более естественно.

ср. книга "Стандарт кодирования 101 С++". Предпочитают определять статические функции-члены, он способствует ослаблению связи.

Ответ 5

Спасибо за ответы. Если я правильно понял это, имя переменной просто было опущено там, потому что это всего лишь прототип. И для прототипа мне не нужно имя переменной, оно необязательно. Это правильно?

Однако, для определения функции мне обязательно нужно имя переменной, правильно?