Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Voprosy_CPP_Semestr_2_1(4).doc
Скачиваний:
3
Добавлен:
26.09.2019
Размер:
144.38 Кб
Скачать

Когда лучше использовать ссылки, а когда - указатели

Опытные программисты безоговорочно отдают предпочтение ссылкам, а не указателям. Ссылки проще использовать, и они лучше справляются с задачей сокрытия информации, как вы видели в предыдущем примере.

Но ссылки нельзя переназначать. Если же вам нужно сначала указывать на один объект, а затем на другой, придется использовать указатель. Ссылки не могут быть нулевыми, поэтому, если существует хоть какая-нибудь вероятность того, что рассматриваемый объект может быть нулевым, вам нельзя использовать ссылку. В этом случае необходимо использовать указатель.

В качестве примера рассмотрим оператор new. Если оператор new не сможет выделить память для нового объекта, он возвратит нулевой указатель. А поскольку ссылка не может быть нулевой, вы не должны инициализировать ссылку на эту память до тех пор, пока не проверите, что она не нулевая. В следующем примере показано, как это сделать:

int *pInt = new int;

if (pInt != NULL)

int &rInt = *pInt;

В этом примере объявляется указатель pInt на значение типа int, который инициализируется областью памяти, возвращаемой оператором new. Адрес этой области памяти (в указателе pInt) тестируется, и, если он не равен значению null, указатель pInt разыменовывается. Результат разыменования переменной типа int представляет собой объект типа int, и ссылка rInt инициализируется этим объектом. Следовательно, ссылка rInt становится псевдонимом для переменной типа int, возвращаемой оператором new.

Рекомендуется:Передавайте функциям параметры как ссылке везде, где это возможно. Обеспечивайте возврат значений как ссылок везде, где это возможно. Используйте спецификатор const для защиты ссылок и указателей везде, где это возможно.

Не рекомендуется: Не используйте указатели, если вместо них можно использовать ссылки. Не возвращайте ссылки на локальные объекты.

  1. Как обратиться к первому и последнему элементу массива?

  1. Сколько элементов содержится в массиве В[5][5][4]?

100

  1. Чем отличается структура от массива?

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

  1. Как провести инициализацию элементов структуры?

struct klass {    char name[20];    char klass_name;    float bal; };

  1. Как осуществляется доступ к элементам структуры?

Обращаться в языке си ( c ) к элементам структуры можно двумя способами:

  1. через операцию-точку

Да, да - обычная точка, которая в языке Си ( c ) выполняет операцию доступа к элементам. Вот пример:

struct foot_klub {    char name[20];    int liga;    float ochki; }; int main(){    struct foot_klub a = {"CSKA", 1, 24.5 };    printf ("%d",a.liga); /* вывод значения элемента liga                             структуры foot_klub */    a.liga = 2; //присваиваем элементу новое значение return 0; }

  1. через операцию-стрелку

Обозначение: '->'. Различия заключаются в том, что операцию-точку мы используем, когда дело имеем с переменной, а операцию-стрелку - когда дело имеет с указателем на переменную. Вот пример:

struct foot_klub *ptr = &a; printf ("%.1f", ptr->ochki);

Не забывайте ставить знак взятия адреса (&) перед именем структуры, так как имя структуры не является указателем. Можно обратиться еще вот так:

printf ("%.1f", (*ptr).ochki);

Но при таком обращении не забывайте брать в скобки (*ptr), т.к. операция доступа имеет более высокий приоритет по сравнению с операцией разыменования.

передача структур в функцию

  1. Должны ли имена параметров, указанные в определении и вызове функции , соответствовать друг другу ?

Нет. Все параметры идентифицируются позицией, а не по имени.

  1. Как следует объявлять функцию, если она не возвращает значения?

Для возврата функции следует установить тип void.

  1. Что такое локальная переменная?

Это переменная, передаваемая или объявленная внутри некоторого блока (обычно функции). Она видима только в пределах этого блока.

  1. Что такое область видимости?

Область видимости определяет "продолжительность жизни" локальных и глобальных переменных и обычно устанавливается набором фигурных скобок.

Областью видимости идентификатора (переменной) называется область программы, в которой на данный идентификатор можно сослаться.

  1. Что такое перегрузка функции?

Это способность записать несколько функций с одним и тем же именем, но с различным числом или типом параметров.

  1. Что такое рекурсия?

В общем случае это способность функции вызывать самое себя

  1. Когда следует использовать глобальные переменные?

Глобальные переменные обычно используются, когда многим функциям нужен доступ к одним и тем же данным. В C++ глобальные переменные используются очень редко.

К какому классу памяти будет относиться переменная по умолчанию?

Объекты класса auto имеют локальное время жизни и локальную область видимости – только ту функцию или тот блок, где они объявлены. Такие переменные называются автоматическими. По умолчанию, т. е. без указания класса, все переменные, объявленные внутри блока, относятся к классу auto. Переменная класса auto начинает существовать при входе в блок, в котором она объявлена. Память под автоматическую переменную выделяется в стеке. При выходе из блока переменная автоматически исчезает. При этом память, отведенная под эту переменную, освобождается. При повторном входе в блок для этой переменной может быть выделен другой участок памяти.

  1. Что такое динамические данные?

память под величины отводится во время выполнения программы. Такие величины будем называть динамическими.

  1. Каким образом выделяется память под динамические данные?

Память под динамическую величину, связанную с указателем, выделяется в результате выполнения стандартной процедуры NEW. Формат обращения к этой процедуре:

 NEW();

Считается, что после выполнения этого оператора создана динамическая величина, имя которой имеет следующий вид:

  := ^

Пусть в программе, в которой имеется приведенное выше описание, присутствуют следующие операторы:

 NEW(P1); NEW(P2); NEW(Pm);

После их выполнения в динамической памяти оказывается выделенным место под три величины (две скалярные и один массив), которые имеют идентификаторы:

P1^, P2^, Pm^

Например, обозначение P1^ можно расшифровать так: динамическая переменная, на которую ссылается указатель P1.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]