Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.50/18: Рейтинг темы: голосов - 18, средняя оценка - 4.50
 Аватар для KeyGen
388 / 295 / 21
Регистрация: 07.08.2011
Сообщений: 790
Записей в блоге: 1

Приведение типов?

04.11.2011, 20:32. Показов 4012. Ответов 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; 
...
Зарание спасибо.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
04.11.2011, 20:32
Ответы с готовыми решениями:

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

Приведение типов
в GUI ни int str = static_convert&lt;int&gt;(Edit1-&gt;Text) ни int str = (int)Edit1-&gt;Text не приводит : E2034 Cannot convert...

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

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

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

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

Да, приведение типов. Любой конструктор с 1 параметром может быть выбран в качестве конструктора преобразования.
Не совсем так! Любой конструктор, который может быть вызван с одним аргументом, является пользовательской функцией преобразования.
2
186 / 186 / 21
Регистрация: 08.01.2011
Сообщений: 1,139
04.11.2011, 21:12
Цитата Сообщение от Сыроежка Посмотреть сообщение
Вообще-то, оператор присваивания должен быть реализован как не статическая функция-член класса ровно с одним параметром. Но в стандарте есть некоторая неясность. В разделе про операторы присваивания есть их деление на (просто) операторы присваивания и составные операторы присваивания. Однако в разделе 13, где описывается перегрузка операторов, используется термин (просто) операторы присваивания, и ничего не говорится про составные операторы присваивания.
Я не очень понял, что вы сказали, но перегрузка операции( даже не важно какой операции) может быть функцией. Причем всегда?!
Это я говорю про то, что есть на практике в VS2008, хотя может в стандарте такое запрещено и не все компиляторы это поддерживают.
1
 Аватар для KeyGen
388 / 295 / 21
Регистрация: 07.08.2011
Сообщений: 790
Записей в блоге: 1
04.11.2011, 21:26  [ТС]
Вот полный код:
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
237 / 210 / 29
Регистрация: 08.06.2011
Сообщений: 467
04.11.2011, 21:33
Вызывается конструктор
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
388 / 295 / 21
Регистрация: 07.08.2011
Сообщений: 790
Записей в блоге: 1
04.11.2011, 22:04  [ТС]
Цитата Сообщение от Net_Wanderer Посмотреть сообщение
const A &operator+=(int n)
- у тебя.

Цитата Сообщение от KeyGen Посмотреть сообщение
friend void operator+=(Km & k, const Km & t);
- у меня. Далеко не int(Km & t) принемается...
0
237 / 210 / 29
Регистрация: 08.06.2011
Сообщений: 467
04.11.2011, 22:15
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
388 / 295 / 21
Регистрация: 07.08.2011
Сообщений: 790
Записей в блоге: 1
04.11.2011, 22:18  [ТС]
Net_Wanderer, Это понятно, но почему с 1-цей слаживаеться когда тип A, не int, double...
0
 Аватар для BRcr
4043 / 2333 / 292
Регистрация: 03.02.2011
Сообщений: 5,066
Записей в блоге: 10
04.11.2011, 22:18
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
388 / 295 / 21
Регистрация: 07.08.2011
Сообщений: 790
Записей в блоге: 1
04.11.2011, 22:37  [ТС]
Дело в том что у меня в классе два обьекта мили и км. Если бы неявно передовалось значение конструктору мили бы соответствовали 10/1.2, но они равны 10 почему то...
0
 Аватар для BRcr
4043 / 2333 / 292
Регистрация: 03.02.2011
Сообщений: 5,066
Записей в блоге: 10
04.11.2011, 23:08
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
Заблокирован
04.11.2011, 23:10
извиняюсь, туплю.
0
 Аватар для KeyGen
388 / 295 / 21
Регистрация: 07.08.2011
Сообщений: 790
Записей в блоге: 1
04.11.2011, 23:15  [ТС]
BRcr,
C++
1
2
3
4
5
6
    Km km=20; 
    
    cout << km;
    
    km+=10;
    cout << endl << km;
Миниатюры
Приведение типов?  
0
 Аватар для KeyGen
388 / 295 / 21
Регистрация: 07.08.2011
Сообщений: 790
Записей в блоге: 1
04.11.2011, 23:17  [ТС]
Цитата Сообщение от BRcr Посмотреть сообщение
k.kilometer=k.kilometer-t.kilometer;
k.mili=k.mili-t.kilometer;
Тут ошибка(извеняюсь) место '-' стоять должен '+'
0
114 / 114 / 13
Регистрация: 29.04.2010
Сообщений: 240
04.11.2011, 23:29
Извините что не по теме, но какой компилятор компилирует такое?
C++
1
2
3
4
5
class Km
{
        static const double DIFFERENCE = 1.2;
        // ...
}
0
186 / 186 / 21
Регистрация: 08.01.2011
Сообщений: 1,139
04.11.2011, 23:31
PraZuBeR
Что вы в этом плохое видите? То, что const? Так а static объекты нельзя что ли изменять? Можно. А автор захотел, чтобы нельзя было.
Или то, что private?
0
114 / 114 / 13
Регистрация: 29.04.2010
Сообщений: 240
04.11.2011, 23:34
То, что
error C2864: 'Km::DIFFERENCE' : only static const integral data members can be initialized within a class
0
186 / 186 / 21
Регистрация: 08.01.2011
Сообщений: 1,139
04.11.2011, 23:39
Понял. Действительно, надо отдельно от класса инициализировать.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
04.11.2011, 23:39
Помогаю со студенческими работами здесь

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

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

Приведение типов
Как привести наследника ко второму родителю? class Parent1 { public: int a; int b; int c; }; class Parent2

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

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


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Первый деплой
lagorue 16.01.2026
Не спеша развернул своё 1ое приложение в kubernetes. А дальше мне интересно создать 1фронтэнд приложения и 2 бэкэнд приложения развернуть 2 деплоя в кубере получится 2 сервиса и что-бы они. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа, решает её и находит: токи, напряжения и их 1 и 2 производные при t = 0;. . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Изучаю kubernetes
lagorue 13.01.2026
А пригодятся-ли мне знания kubernetes в России?
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru