C++ Программирование в среде С++ Builder 5

         

Функции преобразования


Объекты класса могут быть преобразованы в другие типы (или созданы из других типов) с помощью операций приведения типа или конструкторов преобразования.

Конструкторы преобразования

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

class Hold {

char *str;

public:

Hold(const char*);

//...

};

main () {

Hold mainObj = "This is a local object in main.";

//. . .

return 0;

Таким образом, в этом примере объявленный в классе конструктор Hold(const char*) является по сути конструктором преобразования.



Ключевое слово explicit

Можно запретить вызовы конструктора с одним параметром в качестве конструктора преобразования, объявив его с ключевым словом explicit. Тем самым будут запрещены неявные вызовы конструктора, подобные показанному в предыдущем параграфе:

class Hold {

char *str;

public:

explicit Hold(const char*);

//. . .

};

main () {

//

// Неявное преобразование недопустимо:

//

// Hold mainObj = "This is a local object in main.";

//...

return 0;

}

Такой конструктор можно вызывать только явным образом, т. е.

Hold mainObj("This is a local object in main.");

или

Hold mainObj = Hold("This is a local object in main.");

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

Операции приведения

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

operator имя_нового_типа();

Процедуры преобразования характеризуются следующими правилами:


  • У процедуры преобразования нет параметров.


  • для процедуры преобразовании не специфицируется явно тип возвращаемого значения. Подразумевается тип, имя которого следует за ключевым словом operator.


  • Процедура преобразования может быть объявлена виртуальной.


  • Она может наследоваться.


  • Вот пример процедуры преобразования:

    #include <stdio.h>

    class Time { int hr, min;

    public:

    Time(int h, int m): hr(h), min(m) {}

    // Конструктор.

    operator int();

    // Процедура преобразования.

    };

    Time::operator int() {

    // Преобразует время в число секунд от начала суток:

    return (3600*hr + 60*min);

    }

    main ()

    {

    int h = 7;

    int m = 40;

    Time t (h, m);

    //

    // Последний параметр вызывает Time::operator int():

    //

    printf("Time: %02d:%02d = %5d seconds.\n", h, m, (int)t);

    return 0;


    Содержание раздела