Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
shprora_po_proge.docx
Скачиваний:
4
Добавлен:
23.09.2019
Размер:
518.78 Кб
Скачать

11.Инициализация объектов.

Ранее было показано, что в языке С++ значения переменных-членов класса можно непосредственно определять в теле явного конструктора. На самом же деле механизм вызова конструктора реализован в два этапа:

  1. инициализация; 2) вызов тела конструктора.

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

#include<iostream>

usingnamespace std;

class avto {

public:

avto(): cena(18500),

rashod(7.2) { name="FORD";} // 1-йконструктор

avto(int p): cena(p),

rashod(8.5) {name="OPEL";} // 2-йконструктор

avto(int p, int c) : cena(p+p*c/100),

rashod(6.5) {name="SKODA";} // 3-йконструктор

~avto(){cout <<"Object destroy!!!"<< endl;} // деструктор

void Output() { cout << name << endl << cena << endl

<< rashod << endl; }

private: char* name;

int cena;

double rashod;

};

Int main()

{ avto A; A.Output();

cout << " ***** " << endl;

avto B(19500); B.Output();

cout << " ***** " << endl;

A=avto(15000,10); A.Output();

return 0;

}

Во всех 3 явных конструкторах значения полей cena и rashod определяются в инициализирующей части, а значение поля name – в теле конструктора.

12Указатель this.

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

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

1. #include<iostream>

2. usingnamespace std;

3. class avto {

4. public: avto(): cena(19700),

5. rashod(5.7) { name="Honda"; }; //конструктор

6. ~avto() { cout <<"Object AVTO destroy!!! "<<this

7.<<" "<<sizeof(avto) << endl;} //деструктор

8. void SetRashod(double rashod) { this->rashod = rashod; }

9. void Output() { cout << "CENA -> "<< cena << endl <<

10."MARKA -> "<< name << endl <<

11."RASHOD ->"<< rashod << endl;}

12. private: char* name;

13. int cena;

14. double rashod; };

16. int main()

17. { avto A;

18. A.SetRashod(7.1);

19. A.Output();

20. avto C;

21. C.Output();

22.return 0; }

В строках 3-15 включительно определяется класс avto. В строках 6-7 приводится определение явного деструктора, внутри которого с помощью указателя this на экран выводится адрес соответствующего объекта (в одном случае объекта A, а в другом случае – объекта C). В 8 строке определяется нестатический метод SetRashod(), в котором продемонстрировано как с помощью указателя this удается одновременно использовать одноименное поле класса и параметр метода.

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