Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лаб5.doc
Скачиваний:
17
Добавлен:
17.11.2019
Размер:
178.18 Кб
Скачать

Доступ к данным-элементам

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

Пример 3.

class coord

{ public: int x, y; // координаты x и y

};

void main()

{ coord org; // представитель класса координат

coord *orgptr = &org; // указатель на представитель класса

org.x = 0; // задание значения координаты x

orgptr>y = 0; // задание значения координаты y

}

Вызов функций-элементов

Функции-элементы класса могут вызывать другие функции-элементы того же класса, используя имя функции.

Пример 4.

class coord

{ int x, y; // координаты x и y

public:

void setcoord(int _x, int _y)

// функция задания значений координат

{ x =_x; y =_y;

};

void getcoord(int &_x, int &_y)

//функция получения значений координат

{_x = x; _y = y;};

};

void main()

{ coord org; // представитель класса координат

coord *orgptr = &org; // указатель на представитель класса

org.setcoord(10, 10); // вызов функции-элемента

// задания значений

int col, row;

orgptr>getcoord(col, row); // вызов функции-элемента

// получения значений координат

}

Указатель this

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

Пример 5.

class simple

{ public:

simple();

void greet() { cout<<“ Hello!”;};

};

simple::simple()

{ greet(); // вызов

this>greet(); // функции

(*this).greet(); // greet()

}

Т.к. функции-элементы могут обращаться ко всем элементам класса просто по имени, в основном указатель this используется для возвращения указателя (return this) или ссылки (return *this) на подразумеваемый объект.

Конструктор

Конструктор инициализирует представитель класса (объект) и является функцией-элементом с тем же именем, что и класс. Конструктор вызывается компилятором всегда, когда создается представитель класса. Объект считается созданным в тот момент, когда завершил работу конструктор объекта.

Для конструкторов выполняются следующие правила:

  • для конструктора не указывается возвращаемый тип;

  • конструктор не может возвращать значение;

  • конструктор не наследуется;

  • для одного класса может существовать один или несколько конструкторов;

  • если конструктор не задан явным образом, то автоматически создаётся пустой конструктор.

Конструктор копирования

Конструктором копирования называется специальный конструктор в языке программирования C++, применяемый для создания нового объекта как копии уже существующего. Такой конструктор принимает как минимум один аргумент: ссылку на копируемый объект.

Обычно компилятор автоматически создает конструктор копирования для каждого класса (известные как неявные конструкторы копирования, т.е. конструкторы копирования, заданные неявным образом), но в некоторых случаях программист создает конструктор копирования, называемый в таком случае явным конструктором копирования (или "конструктором копирования, заданным явным образом"). В подобных случаях компилятор не создает неявные конструкторы.

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

X(const X&);

X(X&);

X(const volatile X&);

X(volatile X&);

X(const X&, int = 10);

X(const X&, double = 1.0, int = 40);

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

X a = X(); // корректно, если есть X(const X&) и не корректно, если есть X(X&)

// так как второй вариант не поддерживает переменные

Другое отличие между ними довольно наглядно:

const X a;

X b = a; // корректно, если есть X(const X&) и не корректно, если есть X(X&)

// так как второй не поддерживает тип const X&

Вид X& конструктора копирования используется когда необходимо изменить копируемый объект. Это довольно редкая ситуация, но она предусмотрена в стандартной библиотеке вызовом std::auto_ptr. Ссылка должна реализовывать:

X a;

X b = a; // корректно, если определен любой из конструкторов копирования

// с момента передачи ссылки

Следующие конструкторы копирования (или постоянные конструкторы) некорректны:

X(X);

X(const X);

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

Существует четыре случая вызова конструктора копирования:

  1. Когда объект возвращает значение

  2. Когда объект передается (функции) по значению в качестве аргумента

  3. Когда объект конструируется на основе другого объекта (того же класса)

  4. Когда компилятор генерирует временный объект (как в первом и втором случаях выше; как явное преобразование и т.д.)

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