Партнерка на США и Канаду по недвижимости, выплаты в крипто

  • 30% recurring commission
  • Выплаты в USDT
  • Вывод каждую неделю
  • Комиссия до 5 лет за каждого referral

return M;

... monstr Vas1a(50). Super(200;

// Новый объект Best инициализируется значениями полей Super;

monstr Best = Vasia. the_best(Super);

Пример 5.2:

class C {
int c1,c2;
public:
void init(int b) { c2=b; c1=b+1; }
C & inc() { c1++; c2++; return *this; }
void *adress() { return this; }
void print() { cout << c1 << c2; }
};
void main(void) {
C a;
a. init(10); a. print(); cout << “ adress=“ << a. adress<< “ inc “ << a. inc().print() << endl;
}

Указатель на объект, для которого вызвана функция-член, является скрытым параметром функции. На этот неявный параметр можно ссылаться явно как на this. В каждой функции класса x указатель this неявно описан как x* this; и инициализирован так, что он указывает на объект, для которого была вызвана функция-член. this не может быть описан явно, так как это ключевое слово. Класс x можно эквивалентным образом описать так:

class x {
int m;
public:
int readm() { return this->m; }
};

class x {
int m;
public:
int readm() { return m; }
};

Указатель this можно также применять для идентификации поля класса в том случае, когда его имя совпадает с именем формального параметра метода. Другой способ идентификации поля использует операцию доступа к области видимости:

void curednt health. 1nt ammo){

this -> health += health; // Использование this

monstr:: ammo += ammo; // Использование операции ::

2. Конструкторы и деструкторы

2.1. Конструкторы

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

НЕ нашли? Не то? Что вы ищете?

Различают три вида конструкторов:

- конструктор без аргументов (конструктор по умолчанию);

- конструктор инициализации;

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

Основные свойства конструкторов:

-  Конструктор нe возвращает значение, даже типа void. Нельзя получить указатель на конструктор.

-  Класс может иметь несколько конструкторов с разными параметрами для разных видов инициализации (при этом используется механизм перегрузки).

-  Конструктор, вызываемый без параметров, называется конструктором по умолчанию.

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

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

-  Конструкторы не наследуются.

-  Конструкторы нельзя описывать с модификаторами const. virtual и static.

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

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

имя_класса имя_объекта [(список параметров)];

/ / Список параметров не должен быть пустым

имя_класса (список параметров);

// Создается объект без имени (список может быть пустым)

имя_класса имя_объекта = выражение;

// Создается объект без имени и копируется

Примеры: monstr Super(200. 300). Vas1a(50). Z:

monstr X = monstr(lOOO):

monstr Y = 500;

В первом операторе создаются три объекта. Значения не указанных параметров устанавливаются по умолчанию. Во втором операторе создается безымянный объект со значением параметра health = 1000 (значение второго параметра устанавливается по умолчанию). Выделяется память под объект X, в которую копируется безымянный объект. В последнем операторе создается безымянный объект со значением параметра health = 500 (значение второго параметра устанавливается по умолчанию). Выделяется память под объект Y, в которую копируется безымянный объект. Такая форма создания объекта возможна в том случае, если для инициализации объекта допускается задать один параметр.

Пример 2.2 класса с несколькими конструкторами - усовершенствуем класс monstr, добавив в него поля, задающие цвет (skin) и имя (name):

enum color {red, green, blue}; // Возможные значения цвета

class monstr{

int health, ammo;

color skin;

char *name;

public:

monstr(int he=100, int am=10);

monstr(color sk);

monstr(char * nam);

int get_health(){return health;}

int get_ammo(){return ammo;}

};

//---- - --

monstr::monstr(int he, int am){

health = he; ammo = am; skin = red; name = 0;

//---- -

monstr::monstr(color sk)(

switch (sk){

case red: health = 100; ammo = 10; skin = red; name = 0; break;

case green: health = 100; ammo = 20; skin =* green; name = 0; break;

case blue: health = 100; ammo = 40; skin = blue; name = 0; break;

}}

// - - -

monstr::monstr(char * nam){

name = new char [strlen(nam) + 1];

// К длине строки добавляется 1 для хранения нуль-символа

strcpyCname. na;

health = 100: ammo =10: sk1n = red;

}

//----

monstr * m = new monstr ("Ork");

monstr Green (green);

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

Перегружать можно не только конструкторы, но и другие методы класса.

Другой способ инициализации полей в конструкторе (кроме присваивания полям значений формальных параметров) — с помощью списка инициализаторов, расположенных после двоеточия между заголовком и телом конструктора:

monstr::monstr(1nt he. int am);

health (he), ammo (am), skin (red), name (0){}

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

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

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

T::T(const Т&) { ... / * Тело конструктора V }

где Т ~ имя класса.

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

• при описании нового объекта с инициализацией другим объектом;

• при передаче объекта в функцию по значению;

• при возврате объекта из функции.

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

Запишем конструктор копирования для класса monstr. Поскольку в нем есть поле name, содержащее указатель на строку символов, конструктор копирования должен выделять память под новую строку и копировать в нее исходную:

monstr::mcnstr(const monstr &М){

i f (M. name){

name = new char [strlen(M. name) + 1]:

strcpyCname. M. name):}

else name = 0;

health = M. health; ammo = M. ammo; skin = M. skin;

}

monstr Vasia (blue);

monstr Super = Vasia; // Работает конструктор копирования

monstr *m = new monstr ("Ore");

monstr Green = *m; // Работает конструктор копирования

Любой конструктор класса, принимающий один параметр какого-либо другого типа, называется конструктором преобразования, поскольку он осуществляет преобразование из типа параметра в тип этого класса.

2.2. Статические методы. Дружественные функции

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

class А{

static int count: // Поле count - скрытое

public:

static void inc_count(){ count++: }

}:

A::1nt count: // Определение в глобальной области

void f(){

А а:

// a. count++ - нельзя, поле count скрытое

// Изменение поля с помощью статического метода:

a. inc_count(): // или А: :inc__count():

}

Статические методы не могут быть константными (const) и виртуальными (virtual).

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

Из за большого объема этот материал размещен на нескольких страницах:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18