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

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

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

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

01.07.2013, 11:42. Просмотров 344. Ответов 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;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
01.07.2013, 11:42     Почему работает присваивание
Посмотрите здесь:

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

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

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

Почему не работает??? - C++
Прога должна считать количество нулевых элементов, и элементов в диапазоне от 7 до 10. А на экран выводится какие-то отрицательные...

Почему не работает gets? - C++
Хочу чтобы функция создавала массив строку. Всё работало если указывать фиксированный размер массива, но я захотел , чтобы main()...

почему не работает? - C++
#include &quot;stdafx.h&quot; #include&lt;iostream&gt; struct item; item *Insert(item *tree); item *InOrder(item *tree); struct item { ...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
-=ЮрА=-
Заблокирован
Автор 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);
Simpson_
15 / 15 / 3
Регистрация: 06.02.2013
Сообщений: 55
01.07.2013, 11:54  [ТС]     Почему работает присваивание #3
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
хотя бы перегруженный оператор присваивания?
Вот в это и вся суть вопроса, перегрузки нет, а присваивание работает... Как???
-=ЮрА=-
Заблокирован
Автор FAQ
01.07.2013, 11:56     Почему работает присваивание #4
Цитата Сообщение от Simpson_ Посмотреть сообщение
а присваивание работает... Как???
- потому что для каждого класса создаётся дефолтный КК(даже если не писали свой), но лучше даже я бы сказал правильней будет писать свой, т.к часто используя дефолт натыкаемся на еррор мол КК не может преобразовать параметр
Toshkarik
1140 / 857 / 51
Регистрация: 03.08.2011
Сообщений: 2,384
Завершенные тесты: 1
01.07.2013, 11:59     Почему работает присваивание #5
Simpson_, Потому что компилятором по умолчанию генерируется конструктор копии, который заменяет оператор присваивания, и в котором происходит поэлементное присваивание. В принципе, этого достаточно, если нет выделения /освобождения памяти.

ADD: опоздал .
-=ЮрА=-
Заблокирован
Автор 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.
Так что
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
но лучше даже я бы сказал правильней будет писать свой,
это суровая правда жизни, КК должен быть свой, хотя для простых классов он может быть и дефолтным.
Croessmah
01.07.2013, 17:54     Почему работает присваивание
  #7

Не по теме:

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

Yandex
Объявления
01.07.2013, 17:54     Почему работает присваивание
Ответ Создать тему
Опции темы

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