Инструменты пользователя

Инструменты сайта


preobrazovanija_opredeljaemye_klassom

Различия

Здесь показаны различия между двумя версиями данной страницы.

Ссылка на это сравнение

preobrazovanija_opredeljaemye_klassom [2010/12/01 08:18] (текущий)
Строка 1: Строка 1:
 +====== Преобразования,​ определяемые классом ======
 +Условно,​ все преобразования типов можно разделить на четыре основные группы:​
 +  * **Cтандартный к стандартному** - эти преобразования уже были нами подробно рассмотрены в одном из уроков.
 +  * **Cтандартный к абстрактному** - преобразования этой группы основаны на использовании конструкторов. ​
 +<​file>​
 +#include <​iostream>​
  
 +using namespace std;
 +
 +class Digit                ​
 +{
 + private:
 + int dig;
 + public:
 + Digit(int iDig){
 + dig=iDig;​
 + }
 + void Show(){
 + cout<<​dig<<"​\n";​
 + }
 +};
 +
 +
 +void main()
 +{
 + // преобразование от int к Digit
 + Digit A(5);
 + A.Show();
 +
 + // преобразование от double к Digit
 + Digit B(3.7);
 + B.Show();
 +
 +}
 +</​file>​
 +Исходя из примера можно сделать вывод, что конструктор с одним аргументом Class::​Class(type) всегда определяет преобразование типа type к типу Class, а не только способ создания объекта при явном обращении к нему. ​
 +
 +  * Абстрактный к стандартному
 +  * Абстрактный к абстрактному ​
 +Для преобразования абстрактного типа к стандартному или абстрактного к абстрактному в С++ существует средство - функция,​ выполняющая преобразование типов, или оператор-функция преобразования типов. Она имеет следующий синтаксис: ​
 +<​file>​
 +Class::​operator type (void);
 +</​file> ​
 +Эта функция выполняет определенное пользователем преобразование типа Class к типу type. Эта функция должна быть членом класса Class и не иметь аргументов. Кроме того, в ее объявлении не указывается тип возвращаемого значения. Обращение к этой функции может быть как явным, так и неявным. Для выполнения явного преобразования можно использовать как традиционную,​ так и "​функциональную"​ форму. ​
 +
 +<​file>​
 +#include <​iostream>​
 +
 +using namespace std;
 +class Number{
 + private:
 + int num;
 + public:
 + Number(int iNum){
 + num=iNum;​
 + }
 + void Show(){
 + cout<<​num<<"​\n";​
 + }
 +};
 +class Digit                ​
 +{
 + private:
 + int dig;
 + public:
 + Digit(int iDig){
 + dig=iDig;​
 + }
 + void Show(){
 + cout<<​dig<<"​\n";​
 + }
 + //​преобразование от Digit к int
 + operator int (){
 + return dig;
 + }
 + //​преобразование от Digit к Number
 + operator Number (){
 + return Number(dig);​
 + }
 +};
 +
 +
 +void main()
 +{
 + Digit A(5);
 + cout<<"​In Digit A:\n";
 + A.Show();
 + // преобразование от Digit к int
 + int a=A;
 + cout<<"​In int a:\n";
 + cout<<​a<<"​\n";​
 +
 + Digit B(3);
 + cout<<"​In Digit B:\n";
 + B.Show();
 +
 + Number b(0);
 + cout<<"​In Number b (before):​\n";​
 + b.Show();
 +
 + //​преобразование от Digit к Number
 + b=B;
 + cout<<"​In Number b (after):​\n";​
 + b.Show();
 +}
 +</​file>​
preobrazovanija_opredeljaemye_klassom.txt · Последние изменения: 2010/12/01 08:18 (внешнее изменение)