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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
xtorne21st
интересующийся
304 / 275 / 19
Регистрация: 25.09.2010
Сообщений: 1,056
#1

В чём разница между total = total + trans и total += trans? - C++

24.08.2012, 14:13. Просмотров 678. Ответов 6
Метки нет (Все метки)

Добрый день. Изучаю четвертое издание Липпмана. Автор задает вопрос: "В программе книжного магазина, при суммировании объектов trans и total, использован обычный оператор плюс, а не составной оператор суммы с присвоением. Почему не использован составной оператор?".
Насколько мне известно а += b идентично a = a + b. Единственные догадки по этому поводу в том, что составной оператор суммы не применяется к объектам класса. Хотя ниже приведенный код работает в обоих вариантах одинаково. Что имел ввиду автор, задавая этот вопрос?

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
#include <iostream>
#include "Sales_item.h"
 
int main()
{
  // объявить переменные для хранения суммы и данных                            
  // следующей записи                                                           
  Sales_item total, trans;
 
  // есть ли данные для обработки?                                              
  if (std::cin >> total) {
    // если да, то прочитать транзакцию                                         
    while (std::cin >> trans)
      if (total.same_isbn(trans))
        // совпадает: изменить суммарное количество                             
        total = total + trans;
      else {
        // не совпадает: отобразить и переписать total                          
        std::cout << total << std::endl;
        total = trans;
      }
        // не забыть отобразить последнюю запись                                
        std::cout << total << std::endl;
  }
  else {
    // нет ввода! Предупредить пользователя                                     
    std::cout << "No data?!" << std::endl;
    return -1; // свидетельство отказа                                          
  }
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
24.08.2012, 14:13
Здравствуйте! Я подобрал для вас темы с ответами на вопрос В чём разница между total = total + trans и total += trans? (C++):

Не пойму алгоритм программы. Функция total - C++
Вот сижу, читаю, не пойму почему в этом примере #include &lt;conio&gt; #include &lt;iostream&gt; using namespace std; void total (int x);...

total size of local objects too large - C++
Проблема: total size of local objects too large Создаю 4 массива вида double a, это необходимый миниум (700, 100, 350), а потом нужно...

Функции (find out the array in which total number of positive elements is bigger) - C++
You given two one-dimention arrays with N numbers inside. You task is to find out the array in which total number of positive elements is...

Можно ли обойти ограничение на максимальный размер массива ? error C2148: total size of array must not exceed 0x7fffffff bytes - C++
Ну собственно Visual Studio 2012, платформа x64, при попытке создать массив из 10-и миллиардов элементов unsigned *test = new unsigned; ...

Calculate total number of operations needed to convert a number from origin to sigle digit - C++
To predict person's fate, numerologist takes time of a person's life in seconds,then adds all it's digits together. If that sum of digits...

Output total amount of numbers in the sequence (not summing -1 ) and than numbers themselves - C++
The input contains a sequence of positive integers not exceeding 1000. The sequence ends with -1.Total amount of numbers is not more than...

6
Andsteadur
153 / 137 / 3
Регистрация: 23.05.2009
Сообщений: 275
24.08.2012, 14:19 #2
Sales_item.h показал бы. Наверняка там для класса Sales_item перегружен только оператор + и =, а += нет.
0
xtorne21st
интересующийся
304 / 275 / 19
Регистрация: 25.09.2010
Сообщений: 1,056
24.08.2012, 15:05  [ТС] #3
Даже если и так, тогда почему нет разницы между total = total + trans и total += trans при выполнении программы?

Sales_item.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
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
136
137
138
139
140
141
142
143
/*
 * This file contains code from "C++ Primer, Fourth Edition", by Stanley B.
 * Lippman, Jose Lajoie, and Barbara E. Moo, and is covered under the
 * copyright and warranty notices given in that book:
 * 
 * "Copyright (c) 2005 by Objectwrite, Inc., Jose Lajoie, and Barbara E. Moo."
 * 
 * 
 * "The authors and publisher have taken care in the preparation of this book,
 * but make no expressed or implied warranty of any kind and assume no
 * responsibility for errors or omissions. No liability is assumed for
 * incidental or consequential damages in connection with or arising out of the
 * use of the information or programs contained herein."
 * 
 * Permission is granted for this code to be used for educational purposes in
 * association with the book, given proper citation if and when posted or
 * reproduced.Any commercial use of this code requires the explicit written
 * permission of the publisher, Addison-Wesley Professional, a division of
 * Pearson Education, Inc. Send your request for permission, stating clearly
 * what code you would like to use, and in what specific way, to the following
 * address: 
 * 
 *  Pearson Education, Inc.
 *  Rights and Contracts Department
 *  75 Arlington Street, Suite 300
 *  Boston, MA 02216
 *  Fax: (617) 848-7047
*/ 
 
#ifndef SALESITEM_H
#define SALESITEM_H
 
// Definition of Sales_item class and related functions goes here
 
 
#include <iostream>
#include <string>
 
class Sales_item {
friend bool operator==(const Sales_item&, const Sales_item&);
// other members as before
public:
    // added constructors to initialize from a string or an istream
    Sales_item(const std::string &book):
              isbn(book), units_sold(0), revenue(0.0) { }
    Sales_item(std::istream &is) { is >> *this; }
    friend std::istream& operator>>(std::istream&, Sales_item&);
    friend std::ostream& operator<<(std::ostream&, const Sales_item&);
public:
    // operations on Sales_item objects
    // member binary operator: left-hand operand bound to implicit this pointer
    Sales_item& operator+=(const Sales_item&);
    // other members as before
    
public:
    // operations on Sales_item objects
    double avg_price() const;
    bool same_isbn(const Sales_item &rhs) const
        { return isbn == rhs.isbn; }
    // default constructor needed to initialize members of built-in type
    Sales_item(): units_sold(0), revenue(0.0) { }
// private members as before
private:
    std::string isbn;
    unsigned units_sold;
    double revenue;
 
};
 
 
// nonmember binary operator: must declare a parameter for each operand
Sales_item operator+(const Sales_item&, const Sales_item&);
 
inline bool 
operator==(const Sales_item &lhs, const Sales_item &rhs)
{
    // must be made a friend of Sales_item
    return lhs.units_sold == rhs.units_sold &&
           lhs.revenue == rhs.revenue &&
       lhs.same_isbn(rhs);
}
 
inline bool 
operator!=(const Sales_item &lhs, const Sales_item &rhs)
{
    return !(lhs == rhs); // != defined in terms of operator==
}
 
using std::istream; using std::ostream;
 
// assumes that both objects refer to the same isbn
inline
Sales_item& Sales_item::operator+=(const Sales_item& rhs) 
{
    units_sold += rhs.units_sold; 
    revenue += rhs.revenue; 
    return *this;
}
 
// assumes that both objects refer to the same isbn
inline
Sales_item 
operator+(const Sales_item& lhs, const Sales_item& rhs) 
{
    Sales_item ret(lhs);  // copy lhs into a local object that we'll return
    ret += rhs;           // add in the contents of rhs 
    return ret;           // return ret by value
}
 
inline
istream& 
operator>>(istream& in, Sales_item& s)
{
    double price;
    in >> s.isbn >> s.units_sold >> price;
    // check that the inputs succeeded
    if (in)
        s.revenue = s.units_sold * price;
    else 
        s = Sales_item();  // input failed: reset object to default state
    return in;
}
 
inline
ostream& 
operator<<(ostream& out, const Sales_item& s)
{
    out << s.isbn << "\t" << s.units_sold << "\t" 
        << s.revenue << "\t" <<  s.avg_price();
    return out;
}
 
inline
double Sales_item::avg_price() const
{
    if (units_sold) 
        return revenue/units_sold; 
    else 
        return 0;
}
 
 
#endif
0
ForEveR
В астрале
Эксперт С++
7978 / 4737 / 321
Регистрация: 24.06.2010
Сообщений: 10,543
Завершенные тесты: 3
24.08.2012, 15:53 #4
xtorne21st, В каком смысле нет? Это два разных оператора. В коде это

C++
1
2
3
4
5
6
7
8
// assumes that both objects refer to the same isbn
inline
Sales_item& Sales_item::operator+=(const Sales_item& rhs) 
{
    units_sold += rhs.units_sold; 
    revenue += rhs.revenue; 
    return *this;
}
и

C++
1
2
3
4
5
6
7
8
9
// assumes that both objects refer to the same isbn
inline
Sales_item 
operator+(const Sales_item& lhs, const Sales_item& rhs) 
{
    Sales_item ret(lhs);  // copy lhs into a local object that we'll return
    ret += rhs;           // add in the contents of rhs 
    return ret;           // return ret by value
}
1
xtorne21st
интересующийся
304 / 275 / 19
Регистрация: 25.09.2010
Сообщений: 1,056
24.08.2012, 16:25  [ТС] #5
Я имею ввиду, что при запуске программы код которой находиться в первом посту, я не заметил разницы в исполнение. Может быть дело в компиляторе? У меня стоит GNU C++
0
DaskOFF
112 / 112 / 9
Регистрация: 02.05.2012
Сообщений: 524
Записей в блоге: 1
24.08.2012, 16:34 #6
ну если смысл один и тот же, что у вас вызвало недовольство
я могу складывать а и б любым из этих способов, результат будет один и тот же, так какая разница пользователю каким из способов я складывал?
PS: эти операторы затрагиваются позже в книге, не зацикливайтесь
разница в том что в первом случае (+=) результат присваивается первой переменной, а при использовании (+) можно присвоить любой другой переменной этого типа без изменения слагаемых
1
xtorne21st
интересующийся
304 / 275 / 19
Регистрация: 25.09.2010
Сообщений: 1,056
24.08.2012, 18:08  [ТС] #7
Ладно, поживём - увидим. Всем спасибо кто откликнулся.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
24.08.2012, 18:08
Привет! Вот еще темы с ответами:

В чём разница между заголовками <c***> и <***.h>? - C++
Пробовал несколько несложных примеров применения обоих вариантов. Результат выполнения идентичен. Компилятор никаких предупреждений не...

В чём разница между процедурами и функциями ? - C++
Мне просто нужно будет выполнить одну и ту же операцию несколько раз, а сама операция включает в себя несколько вычислений , создание...

Не объясните в чём разница между случаями - C++
Привет! Тут вот небольшой вопросик по поводу. Читаю книжку Страуструпа нашего и возник вопросик. ...

В чём разница между string и символьными массивами? - C++
Собсна какая тема, такой и вопрос. Если выразить его по-точнее, то в чём существенные плюсы того и другого в разных ситуациях? Изучаю С++...


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

Или воспользуйтесь поиском по форуму:
7
Yandex
Объявления
24.08.2012, 18:08
Ответ Создать тему
Опции темы

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