16 / 16 / 3
Регистрация: 06.02.2013
Сообщений: 57
1

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

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

Author24 — интернет-сервис помощи студентам
Пример из книги.

Немогу понять, почему работает присваивание в 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
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
01.07.2013, 11:42
Ответы с готовыми решениями:

Почему не работает двойное присваивание?
Всем привет. Не могу понять, почему не работает двойное присваивание в строке 28. Код: ...

Присваивание операторов (хз почему не робит)
Собственно завело в ступор то, что программа не работает. Просто реально теперь у меня ступор...

Как работает присваивание
#include &lt;iostream&gt; using namespace std; class A{ int a,b; A &amp;operator=(const A...

Нужно ввести дату в формате dd.mm.yyyy - не работает присваивание
Создал свой класс date. Принцип работы прост. Просто нужно ввести дату в формате dd.mm.yyyy...

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
16 / 16 / 3
Регистрация: 06.02.2013
Сообщений: 57
01.07.2013, 11:54  [ТС] 3
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
хотя бы перегруженный оператор присваивания?
Вот в это и вся суть вопроса, перегрузки нет, а присваивание работает... Как???
0
Заблокирован
Автор FAQ
01.07.2013, 11:56 4
Цитата Сообщение от Simpson_ Посмотреть сообщение
а присваивание работает... Как???
- потому что для каждого класса создаётся дефолтный КК(даже если не писали свой), но лучше даже я бы сказал правильней будет писать свой, т.к часто используя дефолт натыкаемся на еррор мол КК не может преобразовать параметр
1
1181 / 894 / 94
Регистрация: 03.08.2011
Сообщений: 2,461
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
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
01.07.2013, 17:54

Не работает присваивание
Пример из Шилдта выдает ошибку, что, мол, левая часть должна быть переменной, индексатором или...

Присваивание высоты не работает
Всем привет. быстро к делу. скрипт короткий: $('#announce img').load(function(){//Скрипт...

Почему смена текста работает только один раз? Что неправильно в коде и почему?
Нужно чтобы при щелчке мыши на поверхности кнопки текст метки Label изменялся на текст окна...

Почему выводится в виде таблицы и почему не работает сортировка
почему выводится в виде таблицы? почему не работает сортировка? и как туда можно вставить классы...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru