Форум программистов, компьютерный форум CyberForum.ru

Приведение типов? - C++

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 16, средняя оценка - 4.94
KeyGen
 Аватар для KeyGen
333 / 289 / 6
Регистрация: 07.08.2011
Сообщений: 789
Записей в блоге: 1
04.11.2011, 20:32     Приведение типов? #1
Подскажите, пожалуйста что происходит. Не понимаю почему такой код работает.
.h
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
class Km
{
private:
        static const double DIFFERENCE = 1.2;
        double kilometer;
        double mili;
 
public:
...
       friend void operator+=(Km & k, const Km & t); //<--
...
       
       friend std::ostream & operator<<(std::ostream & os, const Km & t);
};
.cpp
C++
1
2
3
4
5
6
7
...
     void operator+=(Km & k, const Km & t)
     {
            k.kilometer=k.kilometer-t.kilometer;
            k.mili=k.mili-t.kilometer;
     }
...
main
C++
1
2
3
4
5
6
7
8
9
10
...
    Km mili=50;
    Km km=20;
    
    km+=mili;                 //Вот тут все понятно
    cout << endl << km; 
    
    km+=10;   //А вот тут не понятно, у меня мысли только о автоматическом приведении типов
    cout << endl << km; 
...
Зарание спасибо.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
04.11.2011, 20:32     Приведение типов?
Посмотрите здесь:

C++ Приведение типов
Приведение типов C++
Приведение типов C++
C++ Приведение типов.
C++ Приведение типов
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Net_Wanderer
235 / 208 / 19
Регистрация: 08.06.2011
Сообщений: 467
04.11.2011, 20:35     Приведение типов? #2
У вас в классе Km есть конструктор, который принимает один параметр типа int, он вызывается неявно, создается временный объект который и передается в функцию (оператор)
Chelioss
179 / 179 / 4
Регистрация: 08.01.2011
Сообщений: 1,131
04.11.2011, 20:39     Приведение типов? #3
Цитата Сообщение от Net_Wanderer Посмотреть сообщение
В классе Km есть конструктор который принимает один параметр типа int ?
C++
1
2
Km mili=50;
 Km km=20;
Как думаешь есть или нет?

Добавлено через 57 секунд
Цитата Сообщение от KeyGen Посмотреть сообщение
//А вот тут не понятно, у меня мысли только о автоматическом приведении типов
Да, приведение типов. Любой конструктор с 1 параметром может быть выбран в качестве конструктора преобразования.
Сыроежка
Заблокирован
04.11.2011, 20:51     Приведение типов? #4
Это какой компилятор его компилирует?
Вообще-то, оператор присваивания должен быть реализован как не статическая функция-член класса ровно с одним параметром. Но в стандарте есть некоторая неясность. В разделе про операторы присваивания есть их деление на (просто) операторы присваивания и составные операторы присваивания. Однако в разделе 13, где описывается перегрузка операторов, используется термин (просто) операторы присваивания, и ничего не говорится про составные операторы присваивания.

Добавлено через 2 минуты
Цитата Сообщение от Chelioss Посмотреть сообщение

Да, приведение типов. Любой конструктор с 1 параметром может быть выбран в качестве конструктора преобразования.
Не совсем так! Любой конструктор, который может быть вызван с одним аргументом, является пользовательской функцией преобразования.
Chelioss
179 / 179 / 4
Регистрация: 08.01.2011
Сообщений: 1,131
04.11.2011, 21:12     Приведение типов? #5
Цитата Сообщение от Сыроежка Посмотреть сообщение
Вообще-то, оператор присваивания должен быть реализован как не статическая функция-член класса ровно с одним параметром. Но в стандарте есть некоторая неясность. В разделе про операторы присваивания есть их деление на (просто) операторы присваивания и составные операторы присваивания. Однако в разделе 13, где описывается перегрузка операторов, используется термин (просто) операторы присваивания, и ничего не говорится про составные операторы присваивания.
Я не очень понял, что вы сказали, но перегрузка операции( даже не важно какой операции) может быть функцией. Причем всегда?!
Это я говорю про то, что есть на практике в VS2008, хотя может в стандарте такое запрещено и не все компиляторы это поддерживают.
KeyGen
 Аватар для KeyGen
333 / 289 / 6
Регистрация: 07.08.2011
Сообщений: 789
Записей в блоге: 1
04.11.2011, 21:26  [ТС]     Приведение типов? #6
Вот полный код:
km.h
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
#ifndef KM_H_
#define KM_H_
#include <iostream>
 
namespace KM
{
    
    
    
class Km
{
private:
        static const double DIFFERENCE = 1.2;
        double kilometer;
        double mili;
 
public:
       //ГЉГ®Г*ñòðóêòîðû//
       Km();
       Km(double, char);
       Km(double);
       //ГЋГЇГҐГ°Г*öèè Г± òèïîì//
       Km operator+(const Km & t)const;
       Km operator-(const Km & t)const;
       Km operator*(const Km & t)const;
       Km operator/(const Km & t)const;
       //ГЋГЇГҐГ°Г*öèè ГІГЁГЇ(+,-,*,/)=
       friend void operator+=(Km & k, const Km & t);
       friend void operator-=(Km & k, const Km & t);
       friend void operator*=(Km & k, const Km & t);
       friend void operator/=(Km & k, const Km & t);
       //ГЋГЇГҐГ°Г*öèè öèôðГ*+ГІГЁГЇ//
       friend Km operator+(const double n, const Km & t);
       friend Km operator-(const double n, const Km & t);
       friend Km operator*(const double n, const Km & t);
       friend Km operator/(const double n, const Km & t);
       
       friend std::ostream & operator<<(std::ostream & os, const Km & t);
};
}
#endif
km.cpp
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
#include "km.h"
 
namespace KM
{
       Km::Km()
       {
           kilometer = mili = 0;
       }
       
       Km::Km(double m, char r)
       {
           if(r=='m'||r=='M')
           {
              kilometer=m*DIFFERENCE;
              mili=m;
           }
           else
           {
           kilometer=0;
           mili=0;
           std::cout << "\nÁûë ïðåìèГ*ГҐГ* Г*ГҐГўГҐГ°Г*ûé ГЁГ*äèôèêГ*òîð! Г‡Г*Г*Г·ГҐГ*ГЁГї ГіГ±ГІГ*Г*îâëåГ*Г*Г» Гў 0.\n";
        }
       }   
           
       Km::Km(double k)
       {
            kilometer=k;
            mili=k/DIFFERENCE;
       }
       
       std::ostream & operator<<(std::ostream & os, const Km & t)
       {
            os << t.kilometer << "-êèëëîìåòðû. " << t.mili << "-ìèëè.";
            
            return os;
       }
       
       Km Km::operator+(const Km & t)const
       {
            double temp=t.kilometer+kilometer;
 
            Km sum(temp);
            
            return sum;
       }
       Km Km::operator-(const Km & t)const
       {
            double temp=kilometer-t.kilometer;
 
            Km sum(temp);
            
            return sum;
       }
    
       Km Km::operator*(const Km & t)const
       {
        double temp=kilometer*t.kilometer;
 
            Km sum(temp);
            
            return sum;
        
      }
    
      Km Km::operator/(const Km & t)const
      {
        double temp=kilometer/t.kilometer;
 
            Km sum(temp);
            
            return sum;
        
      }
    
     Km operator+(const double n, const Km & t)
     {
        double temp=n+t.kilometer;
 
            Km sum(temp);
            
            return sum;
     }
     
     Km operator-(const double n, const Km & t)
     {
        double temp=n-t.kilometer;
 
            Km sum(temp);
            
            return sum;
     }
     
     Km operator*(const double n, const Km & t)
     {
        double temp=n*t.kilometer;
 
            Km sum(temp);
            
            return sum;
     }
     
     Km operator/(const double n, const Km & t)
     {
        double temp=n/t.kilometer;
 
            Km sum(temp);
            
            return sum;
     }
     
     void operator+=(Km & k, const Km & t)
     {
            k.kilometer=k.kilometer-t.kilometer;
            k.mili=k.mili-t.kilometer;
     }
     
     void operator-=(Km & k, const Km & t)
     {
            k.kilometer=k.kilometer-t.kilometer;
            k.mili=k.mili-t.kilometer;
     }
     
     void operator*=(Km & k, const Km & t)
     {
            k.kilometer=k.kilometer*t.kilometer;
            k.mili=k.mili*t.kilometer;
     }
     
     void operator/=(Km & k, const Km & t)
     {
            k.kilometer=k.kilometer/t.kilometer;
            k.mili=k.mili/t.kilometer;
     }
    
}
main.cpp
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
#include <iostream>
#include "km.h"
 
using std::cout;
using std::cin;
using std::endl;
using KM::Km;
 
int main()
{
    setlocale(LC_ALL, "rus");
    
    Km mili(50);
    Km km=20;
    
    cout << mili+km << endl;
    cout << mili-km << endl;
    cout << mili*km << endl;
    cout << mili/km << endl;
    
    cout << endl;
    
    cout << km+100 << endl;
    cout << 100-km << endl;
    cout << 100*km << endl;
    cout << 100/km << endl;
    
    km+=mili;
    cout << endl << km;
    
    km-=mili;
    cout << endl << km;  
    
    km*=mili;
    cout << endl << km; 
    
    km/=mili;
    cout << endl << km; 
    
    km+=10;
    cout << endl << km; //???
    
    
    cout << "\n\n\n";
    system("PAUSE");
    return 0;
}
Net_Wanderer
235 / 208 / 19
Регистрация: 08.06.2011
Сообщений: 467
04.11.2011, 21:33     Приведение типов? #7
Вызывается конструктор
C++
1
Km(double);
int приводится к double, пруф:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <iostream>
 
class A {
public:
    A(double d)
    {
        std::cout << "constructor with double parameter\n";
    }
    const A &operator+=(int n)
    {
        return *this;
    }
};
 
int main()
{
    A a(0.0);
    a += 1;
}
KeyGen
 Аватар для KeyGen
333 / 289 / 6
Регистрация: 07.08.2011
Сообщений: 789
Записей в блоге: 1
04.11.2011, 22:04  [ТС]     Приведение типов? #8
Цитата Сообщение от Net_Wanderer Посмотреть сообщение
const A &operator+=(int n)
- у тебя.

Цитата Сообщение от KeyGen Посмотреть сообщение
friend void operator+=(Km & k, const Km & t);
- у меня. Далеко не int(Km & t) принемается...
Net_Wanderer
235 / 208 / 19
Регистрация: 08.06.2011
Сообщений: 467
04.11.2011, 22:15     Приведение типов? #9
KeyGen,
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <iostream>
 
class A {
public:
    A(double d)
    {
        std::cout << "constructor with double parameter\n";
    }
    friend void operator+=(A &a, const A &b);
};
 
void operator+=(A &a, const A &b)
{
}
 
int main()
{
    A a(0.0);
    a += 1;
}
KeyGen
 Аватар для KeyGen
333 / 289 / 6
Регистрация: 07.08.2011
Сообщений: 789
Записей в блоге: 1
04.11.2011, 22:18  [ТС]     Приведение типов? #10
Net_Wanderer, Это понятно, но почему с 1-цей слаживаеться когда тип A, не int, double...
BRcr
 Аватар для BRcr
4003 / 2292 / 155
Регистрация: 03.02.2011
Сообщений: 5,064
Записей в блоге: 10
04.11.2011, 22:18     Приведение типов? #11
friend void operator+=(Km & k, const Km & t);
- у меня. Далеко не int(Km & t) принемается...
k и t в данном случае левый и правый параметры оператора +=
в таком вызове:
C++
1
2
Km Km_class;
Km_class += 10;
левым параметром будет Km_class, а правым параметром будет число 10, которое сперва неявно передается одному из конструкторов Km(который принимает int) и превращается в полноценный объект класса Km. Вот этот-то новый объект и передается оператору += в качестве правого параметра...
KeyGen
 Аватар для KeyGen
333 / 289 / 6
Регистрация: 07.08.2011
Сообщений: 789
Записей в блоге: 1
04.11.2011, 22:37  [ТС]     Приведение типов? #12
Дело в том что у меня в классе два обьекта мили и км. Если бы неявно передовалось значение конструктору мили бы соответствовали 10/1.2, но они равны 10 почему то...
BRcr
 Аватар для BRcr
4003 / 2292 / 155
Регистрация: 03.02.2011
Сообщений: 5,064
Записей в блоге: 10
04.11.2011, 23:08     Приведение типов? #13
C++
1
2
3
4
5
 void operator+=(Km & k, const Km & t)
     {
            k.kilometer=k.kilometer-t.kilometer;
            k.mili=k.mili-t.kilometer;
     }
у вас параметр t.mili вообще не используется.
вот в теле данной функции t.mili, по идее, должно быть равно 10/DIFFERENCE...
Bers
Заблокирован
04.11.2011, 23:10     Приведение типов? #14
извиняюсь, туплю.
KeyGen
 Аватар для KeyGen
333 / 289 / 6
Регистрация: 07.08.2011
Сообщений: 789
Записей в блоге: 1
04.11.2011, 23:15  [ТС]     Приведение типов? #15
BRcr,
C++
1
2
3
4
5
6
    Km km=20; 
    
    cout << km;
    
    km+=10;
    cout << endl << km;
Миниатюры
Приведение типов?  
KeyGen
 Аватар для KeyGen
333 / 289 / 6
Регистрация: 07.08.2011
Сообщений: 789
Записей в блоге: 1
04.11.2011, 23:17  [ТС]     Приведение типов? #16
Цитата Сообщение от BRcr Посмотреть сообщение
k.kilometer=k.kilometer-t.kilometer;
k.mili=k.mili-t.kilometer;
Тут ошибка(извеняюсь) место '-' стоять должен '+'
prazuber
108 / 108 / 3
Регистрация: 29.04.2010
Сообщений: 240
04.11.2011, 23:29     Приведение типов? #17
Извините что не по теме, но какой компилятор компилирует такое?
C++
1
2
3
4
5
class Km
{
        static const double DIFFERENCE = 1.2;
        // ...
}
Chelioss
179 / 179 / 4
Регистрация: 08.01.2011
Сообщений: 1,131
04.11.2011, 23:31     Приведение типов? #18
PraZuBeR
Что вы в этом плохое видите? То, что const? Так а static объекты нельзя что ли изменять? Можно. А автор захотел, чтобы нельзя было.
Или то, что private?
prazuber
108 / 108 / 3
Регистрация: 29.04.2010
Сообщений: 240
04.11.2011, 23:34     Приведение типов? #19
То, что
error C2864: 'Km::DIFFERENCE' : only static const integral data members can be initialized within a class
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
04.11.2011, 23:39     Приведение типов?
Еще ссылки по теме:

Приведение типов C++
Приведение типов C++
C++ Приведение типов

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Chelioss
179 / 179 / 4
Регистрация: 08.01.2011
Сообщений: 1,131
04.11.2011, 23:39     Приведение типов? #20
Понял. Действительно, надо отдельно от класса инициализировать.
Yandex
Объявления
04.11.2011, 23:39     Приведение типов?
Ответ Создать тему
Опции темы

Текущее время: 19:58. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru