Указатели, ссылки, квалификатор const. — КиберПедия 

Типы сооружений для обработки осадков: Септиками называются сооружения, в которых одновременно происходят осветление сточной жидкости...

Археология об основании Рима: Новые раскопки проясняют и такой острый дискуссионный вопрос, как дата самого возникновения Рима...

Указатели, ссылки, квалификатор const.

2022-09-01 36
Указатели, ссылки, квалификатор const. 0.00 из 5.00 0 оценок
Заказать работу

Указатели, ссылки, квалификатор const.

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

Указателю не может быть присвоена величина, не являющаяся адресом. Нельзя присвоить указателю одного типа значение, являющееся адресом объекта другого типа. Для разрешения таких ситуаций введен специальный указатель void, который может указывать на любой тип данных.

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

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

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

квалификатор const - превращаем переменную в константу со значением, значение которой не может быть изменено. константы без ее инициализации также вызывает ошибку компиляции. компилятор просто запрещает присваивание адресов констант обычным указателям. решение - указатели, объявленные со спецификатором const. Константный указатель не позволяет изменять адресуемый им объект с помощью косвенной адресации. В реальных программах указатели на константы чаще всего употребляются как формальные параметры функций. Попытка присвоить значение константному указателю вызовет ошибку компиляции.

int funct (int, int) const {}.

Итераторы.

Итератор предоставляет обобщенный способ перебора элементов любого контейнера – как последовательного, так и ассоциативного.

Все контейнеры имеют функции-члены begin() и end() - begin() возвращает итератор, указывающий на первый элемент контейнера. - end() возвращает итератор, указывающий на элемент, следующий за последним в контейнере.

// vector<string> vec;vector<string>::iterator iter = vec.begin();vector<string>::iterator iter_end = vec.end();

 

Итераторы поддерживают адресную арифметику. Арифметические действия с итераторами возможны только для контейнеров vector и deque. list не поддерживает адресную арифметику, поскольку его элементы не располагаются в непрерывной области памяти.

Для того чтобы напечатать все элементы вектора, нужно написать:

vector<string> name;vector<string>::iterator itt;for(itt=name.begin(); itt!= name.end(); itt++) cout << *itt << '\n';

 

Прототип функции. Параметры функции (указатели, ссылки, массивы, по

Умолчанию).

Прототип функции описывает ее интерфейс и состоит из типа возвращаемого функцией значения, имени и списка параметров.

Тип возвращаемого функцией значения бывает встроенным, как int или double, составным, как int& или double*, или определенным пользователем – перечислением или классом. void-функция не возвращает никакого значения.

#include <string>#include <vector> class Date { /* определение */ }; bool look_up(int *, int); {i->a()}
double calc(double);
int count(string &i, char j); {i.a()}
Date& calendar(const char);
void sum(vector<int>&, int);

 

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

Каждому параметру функции отводится место в памяти, его размер определяется типом параметра. Стандартным способом передачи аргументов является копирование их значений, т.е. передача по значению. По ссылке - При такой передаче функция манипулирует локальными копиями аргументов. Использования: Во-первых, тогда, когда без использования ссылок пришлось бы менять типы параметров на указатели; Во-вторых, при необходимости вернуть из функции несколько значений; В-третьих, для передачи большого объекта типа класса;

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

Параметры-массивы. Массив в С++ никогда не передается по значению, а только как указатель на его первый, точнее нулевой, элемент. Размер массива неважен при объявлении параметра.

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

int funct(int a, int b=5, char =’i’){};

Обобщенные алгоритмы.

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

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

  • способ обхода коллекции: переход к следующему элементу и распознавание того, что достигнут конец коллекции. При работе с встроенным типом массива мы решаем эту проблему, передавая два аргумента: указатель на первый элемент и число элементов, подлежащих обходу (в случае строк символов в стиле C передавать второй аргумент необязательно, так как конец строки обозначается двоичным нулем);
  • умение сравнивать каждый элемент контейнера с искомым значением. Обычно это делается с помощью оператора равенства, ассоциированного со значениями типа, или путем передачи указателя на функцию, осуществляющую сравнение;
  • некоторый обобщенный тип для представления позиции элемента внутри контейнера и специального признака на случай, если элемент не найден. Обычно мы возвращаем индекс элемента либо указатель на него. В ситуации, когда поиск неудачен, возвращается –1 вместо индекса или 0 вместо указателя.

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

Например, алгоритм find() для встроенного массива элементов типа int можно использовать так:

int search_value; int ia[ 6 ] = { 27, 210, 12, 47, 109, 83 }; cin >> search_value; int *presult = find(&ia[0], &ia[6], search_value);

Если возвращенный указатель равен адресу &ia[6] (который расположен за последним элементом массива), то поиск оказался безрезультатным, в противном случае значение найдено.

Нужно создать один вектор, включающий все элементы исходных векторов. Это делается с помощью обобщенного алгоритма copy() (для его использования необходимо включить заголовочные файлы algorithm и iterator).

Алгоритм unique() удаляет из контейнера дубликаты, расположенные рядом. Если дана последовательность 01123211, то результатом будет 012321, а не 0123.

// отсортировать вектор texts sort(texts.begin(), texts.end()); // удалить дубликаты vector<string, allocator>::iterator it; it = unique(texts.begin(), texts.end()); texts.erase(it, texts.end());

 

This. Друзья класса.

Классах служит чтобы определять пользователям собственные типы данных. Определение класса состоит из двух частей: заголовка, включающего ключевое слово class, за которым следует имя класса, и тела, заключенного в фигурные скобки.

class First { int memi; double memd;};

Инкапсуляция – принцип ООП, который гласит о том, что данные и функции которые выполян. над этими данными, должны быть в одном месте (в классе).

Свойства класса – любая переменная класса.

три уровня доступа: private, protected и public. Известно, что private можно опускать при описании классов, private ставится по умолчанию.

Ни один из наследников не сможет доступиться к private-данным. К public могут иметь доступ все, кто видит.  protected – доступ классам наследникам.

class Screen {public: // функции-членыprivate:

};

this - указатель на текущий объект. Указатель this хранит адрес объекта, для которого была вызвана функция-член.

class T{

int x;

void foo() {

   this->x = 5; // м.ж. использ. свойство либо через this, либо по имени.

   x = 6; }

 

void foo() const{

   this->x = 7; // будет ошибка }

 

void foo (int x){

   this->x = x; // когда имена совпадают имена приним. переменой с именем свойсва класса }

 

T& operator= (const T& b){

   x = b.x;

   return *this; // исп. для возвращ. текущего объекта из метода (a+b+c) }

 

void bar (const T& b){

   *this = b; // исп. перегруж. метода опертаора=

   this->operator= (b); }

};

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

class Base{ friend class X;};class X {…}

 

Шаблоны классов.

Полиморфизм.

Указатели, ссылки, квалификатор const.

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

Указателю не может быть присвоена величина, не являющаяся адресом. Нельзя присвоить указателю одного типа значение, являющееся адресом объекта другого типа. Для разрешения таких ситуаций введен специальный указатель void, который может указывать на любой тип данных.

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

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

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

квалификатор const - превращаем переменную в константу со значением, значение которой не может быть изменено. константы без ее инициализации также вызывает ошибку компиляции. компилятор просто запрещает присваивание адресов констант обычным указателям. решение - указатели, объявленные со спецификатором const. Константный указатель не позволяет изменять адресуемый им объект с помощью косвенной адресации. В реальных программах указатели на константы чаще всего употребляются как формальные параметры функций. Попытка присвоить значение константному указателю вызовет ошибку компиляции.

int funct (int, int) const {}.


Поделиться с друзьями:

Механическое удерживание земляных масс: Механическое удерживание земляных масс на склоне обеспечивают контрфорсными сооружениями различных конструкций...

Типы оградительных сооружений в морском порту: По расположению оградительных сооружений в плане различают волноломы, обе оконечности...

Папиллярные узоры пальцев рук - маркер спортивных способностей: дерматоглифические признаки формируются на 3-5 месяце беременности, не изменяются в течение жизни...

Историки об Елизавете Петровне: Елизавета попала между двумя встречными культурными течениями, воспитывалась среди новых европейских веяний и преданий...



© cyberpedia.su 2017-2024 - Не является автором материалов. Исключительное право сохранено за автором текста.
Если вы не хотите, чтобы данный материал был у нас на сайте, перейдите по ссылке: Нарушение авторских прав. Мы поможем в написании вашей работы!

0.039 с.