Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 16, средняя оценка - 4.94
KeyGen
384 / 291 / 21
Регистрация: 07.08.2011
Сообщений: 790
Записей в блоге: 1
#1

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

04.11.2011, 20:32. Просмотров 2324. Ответов 27
Метки нет (Все метки)

Подскажите, пожалуйста что происходит. Не понимаю почему такой код работает.
.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; 
...
Зарание спасибо.
http://www.cyberforum.ru/cpp-beginners/thread366779.html
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
04.11.2011, 20:32
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Приведение типов? (C++):

Приведение типов
Делаю программу, которая кроме всего прочего должна отсортировать массив....

Приведение типов.
Столкнулся с задачей считывания данных из символьного массива с дальнейшим...

Приведение типов
Доброго времени суток. Пусть имеются две структуры struct Student {...

Приведение типов
При вводе с клавиатуры s = 11 и a = 1.1, получаем 9. Результат переменной d =...

Приведение типов
Всем привет) Есть массив int a = {2 ,4 ,5 ,6 ,256} Числа располагаются по...

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

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

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

Да, приведение типов. Любой конструктор с 1 параметром может быть выбран в качестве конструктора преобразования.
Не совсем так! Любой конструктор, который может быть вызван с одним аргументом, является пользовательской функцией преобразования.
2
Chelioss
181 / 181 / 21
Регистрация: 08.01.2011
Сообщений: 1,139
04.11.2011, 21:12 #5
Цитата Сообщение от Сыроежка Посмотреть сообщение
Вообще-то, оператор присваивания должен быть реализован как не статическая функция-член класса ровно с одним параметром. Но в стандарте есть некоторая неясность. В разделе про операторы присваивания есть их деление на (просто) операторы присваивания и составные операторы присваивания. Однако в разделе 13, где описывается перегрузка операторов, используется термин (просто) операторы присваивания, и ничего не говорится про составные операторы присваивания.
Я не очень понял, что вы сказали, но перегрузка операции( даже не важно какой операции) может быть функцией. Причем всегда?!
Это я говорю про то, что есть на практике в VS2008, хотя может в стандарте такое запрещено и не все компиляторы это поддерживают.
1
KeyGen
384 / 291 / 21
Регистрация: 07.08.2011
Сообщений: 790
Записей в блоге: 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;
}
0
Net_Wanderer
235 / 208 / 29
Регистрация: 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;
}
0
KeyGen
384 / 291 / 21
Регистрация: 07.08.2011
Сообщений: 790
Записей в блоге: 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) принемается...
0
Net_Wanderer
235 / 208 / 29
Регистрация: 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;
}
1
KeyGen
384 / 291 / 21
Регистрация: 07.08.2011
Сообщений: 790
Записей в блоге: 1
04.11.2011, 22:18  [ТС] #10
Net_Wanderer, Это понятно, но почему с 1-цей слаживаеться когда тип A, не int, double...
0
BRcr
4015 / 2305 / 291
Регистрация: 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. Вот этот-то новый объект и передается оператору += в качестве правого параметра...
0
KeyGen
384 / 291 / 21
Регистрация: 07.08.2011
Сообщений: 790
Записей в блоге: 1
04.11.2011, 22:37  [ТС] #12
Дело в том что у меня в классе два обьекта мили и км. Если бы неявно передовалось значение конструктору мили бы соответствовали 10/1.2, но они равны 10 почему то...
0
BRcr
4015 / 2305 / 291
Регистрация: 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...
0
Bers
Заблокирован
04.11.2011, 23:10 #14
извиняюсь, туплю.
0
KeyGen
384 / 291 / 21
Регистрация: 07.08.2011
Сообщений: 790
Записей в блоге: 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;
0
Миниатюры
Приведение типов?  
KeyGen
384 / 291 / 21
Регистрация: 07.08.2011
Сообщений: 790
Записей в блоге: 1
04.11.2011, 23:17  [ТС] #16
Цитата Сообщение от BRcr Посмотреть сообщение
k.kilometer=k.kilometer-t.kilometer;
k.mili=k.mili-t.kilometer;
Тут ошибка(извеняюсь) место '-' стоять должен '+'
0
prazuber
110 / 110 / 13
Регистрация: 29.04.2010
Сообщений: 240
04.11.2011, 23:29 #17
Извините что не по теме, но какой компилятор компилирует такое?
C++
1
2
3
4
5
class Km
{
        static const double DIFFERENCE = 1.2;
        // ...
}
0
Chelioss
181 / 181 / 21
Регистрация: 08.01.2011
Сообщений: 1,139
04.11.2011, 23:31 #18
PraZuBeR
Что вы в этом плохое видите? То, что const? Так а static объекты нельзя что ли изменять? Можно. А автор захотел, чтобы нельзя было.
Или то, что private?
0
prazuber
110 / 110 / 13
Регистрация: 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
0
Chelioss
181 / 181 / 21
Регистрация: 08.01.2011
Сообщений: 1,139
04.11.2011, 23:39 #20
Понял. Действительно, надо отдельно от класса инициализировать.
0
04.11.2011, 23:39
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
04.11.2011, 23:39
Привет! Вот еще темы с решениями:

Приведение типов
Есть ли какая-нибудь разница в следующих выражениях: float a = 123.4f ...

Приведение типов
Как компилятор заставить адекватней приводить типы? (VS2012) Например: int...

Приведение типов
В чем различие привидения типа (type)expression, от type(expression)?

Приведение типов
Доброго времени суток. Данный кусок кода выделяет целую часть. Потом,...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru