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

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

Войти
Регистрация
Восстановить пароль
 
Simpson_
16 / 16 / 3
Регистрация: 06.02.2013
Сообщений: 57
#1

Почему работает присваивание - C++

01.07.2013, 11:42. Просмотров 370. Ответов 6
Метки нет (Все метки)

Пример из книги.

Немогу понять, почему работает присваивание в 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
//Complex.h
#ifndef COMPLEX_H
#define COMPLEX_H
 
#include <iostream>
using std::ostream;
using std::istream;
 
class Complex
{
        friend ostream &operator<<(ostream &, const Complex &);
        
    public:
        Complex (double = 0.0, double = 0.0);
        Complex operator+(const Complex &) const;
        Complex operator-(const Complex &) const;   
        void print() const;
    private:
        double real;
        double imaginary;       
};
#endif
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
//Complex.cpp
#include <iostream>
using std::cout;
 
#include "Complex.h"
 
Complex::Complex(double realPart, double imaginaryPart) : real(realPart), imaginary(imaginaryPart)
{
}
 
Complex Complex::operator+(const Complex &operand2) const
{
    return Complex(real+operand2.real, imaginary+operand2.imaginary);
}
 
Complex Complex::operator-(const Complex &operand2) const
{
    return Complex(real-operand2.real, imaginary-operand2.imaginary);
}
 
ostream &operator<<(ostream &output, const Complex &s)
{
    output<<'('<<s.real<<((s.imaginary<0) ? " - j" : " + j")<<s.imaginary<<')';
    
    return output;
}
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
//main.cpp
#include <iostream>
using std::cout;
using std::endl;
using std::boolalpha;
 
#include "Complex.h"
 
int main()
{
    Complex x;
    Complex y(4.3, 8.2);
    Complex z(3.3, -1.1);
    
    x=y+z;                                         //почему это работает???
    cout<<"\n\nx = y + z: "<<endl;
    cout<<x;
    cout<<" = ";
    cout<<y;
    cout<<" + ";
    cout<<z;
    
    return 0;
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
01.07.2013, 11:42
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Почему работает присваивание (C++):

Почему не работает двойное присваивание? - C++
Всем привет. Не могу понять, почему не работает двойное присваивание в строке 28. Код: #include &lt;iostream&gt; using namespace...

Присваивание операторов (хз почему не робит) - C++
Собственно завело в ступор то, что программа не работает. Просто реально теперь у меня ступор почему не работает. Ошибка: (13): error...

Нужно ввести дату в формате dd.mm.yyyy - не работает присваивание - C++
Создал свой класс date. Принцип работы прост. Просто нужно ввести дату в формате dd.mm.yyyy Возникли следующие вопросы: 1) Почему не...

Почему выводится в виде таблицы и почему не работает сортировка - C++
почему выводится в виде таблицы? почему не работает сортировка? и как туда можно вставить классы комнат? hotel.h #include...

Почему программа не работает на MFC статичной библиотеки. а вот на стандартном мфс работает - C++
почему программа не работает на MFC статичной библиотеки. а вот на стандартном мфс работает. Имею в ввиду что сделал прогу которая меняет...

Почему в динамическом массиве не работает то, что работает со статическим? - C++
Программа зависает #include&lt;iostream&gt; #include&lt;stdlib.h&gt; #include&lt;time.h&gt; using namespace std; int main() { ...

6
-=ЮрА=-
Заблокирован
Автор FAQ
01.07.2013, 11:52 #2
Simpson_, где твой конструкторы копирования/преобразования либо хотя бы перегруженный оператор присваивания?

Возьми лучше готовое, там линки на 4 реализации CComplex
С++ класс (создайте класс с именем Complex для выполнения в арифмитических операий с комплексными числами))

Добавлено через 4 минуты
Цитата Сообщение от Simpson_ Посмотреть сообщение
x=y+z;
- для простоты напиши KK
C++
1
2
3
4
5
Сomplex(const Complex &pCopy)
{
     real = pCopy.real;
     imaginary = Copy.imaginary;
}
И модернезируй код так
C++
1
x=Complex(y+z);
0
Simpson_
16 / 16 / 3
Регистрация: 06.02.2013
Сообщений: 57
01.07.2013, 11:54  [ТС] #3
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
хотя бы перегруженный оператор присваивания?
Вот в это и вся суть вопроса, перегрузки нет, а присваивание работает... Как???
0
-=ЮрА=-
Заблокирован
Автор FAQ
01.07.2013, 11:56 #4
Цитата Сообщение от Simpson_ Посмотреть сообщение
а присваивание работает... Как???
- потому что для каждого класса создаётся дефолтный КК(даже если не писали свой), но лучше даже я бы сказал правильней будет писать свой, т.к часто используя дефолт натыкаемся на еррор мол КК не может преобразовать параметр
1
Toshkarik
1147 / 864 / 51
Регистрация: 03.08.2011
Сообщений: 2,404
Завершенные тесты: 1
01.07.2013, 11:59 #5
Simpson_, Потому что компилятором по умолчанию генерируется конструктор копии, который заменяет оператор присваивания, и в котором происходит поэлементное присваивание. В принципе, этого достаточно, если нет выделения /освобождения памяти.

ADD: опоздал .
1
-=ЮрА=-
Заблокирован
Автор FAQ
01.07.2013, 12:00 #6
Simpson_, скажем запихни в приват-параметры ifstream ifs;
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
class Complex
{
        friend ostream &operator<<(ostream &, const Complex &);
        
    public:
        Complex (double = 0.0, double = 0.0);
        Complex operator+(const Complex &) const;
        Complex operator-(const Complex &) const;   
        void print() const;
    private:
        double real;
        double imaginary;  
        ifstream ifs;//вот что покоробит дефолт     
};
и погляди на линковку
http://codepad.org/nfYZgtVk
/usr/local/lib/gcc/i686-pc-linux-gnu/4.1.2/../../../../include/c++/4.1.2/bits/ios_base.h: In copy constructor 'std::basic_ios<char, std::char_traits<char> >::basic_ios(const std::basic_ios<char, std::char_traits<char> >&)':
Line 778: error: 'std::ios_base::ios_base(const std::ios_base&)' is private
compilation terminated due to -Wfatal-errors.
Так что
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
но лучше даже я бы сказал правильней будет писать свой,
это суровая правда жизни, КК должен быть свой, хотя для простых классов он может быть и дефолтным.
1
Croessmah
01.07.2013, 17:54     Почему работает присваивание
  #7

Не по теме:

имхо, при написании не тривиальных классов лучше явно определять все шесть специальных функций-членов или удалять те, которые не нужны

0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
01.07.2013, 17:54
Привет! Вот еще темы с ответами:

Почему не работает cin.clear() и как работает sync()? - C++
#include&lt;iostream&gt; #include&lt;cstring&gt; using namespace std; char*input(char*ch,int&amp;n){ cin.getline(ch,20); //cin.sync(); ...

Не могу понять почему не работает (или правильно не работает) - C++
#include &lt;iostream.h&gt; #include &lt;conio.h&gt; #define N 5 #define M 3 void main() { int a; int i,j; cout&lt;&lt;&quot;nachalnya...

Почему в библиотеке не работает то, что спокойно работает в программе? - C++
День всем добрый! Я здесь решил собрать библиотеку для конструктора игр Game Maker. Хотел поэкспериментировать. Как всегда, у...

Теория. Почему в данном случае copy() не работает после reserve(), но работает после resize()? - C++
Есть такая функция: void Array::SetStartIndexes(sz3_Arr_t *array) { start_index.reserve(array-&gt;size()); ...


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

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

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