Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 04.12.2011, 16:48   #1
DenisS0
 
Регистрация: 22.03.2010
Сообщений: 4
По умолчанию Конструктор копирования и оператор присваивания

Не понимаю, когда используется один, а когда другой. Написал простой пример с комплексными числами - при компиляции в VS2010 и CodeBlock 10 выдаёт разный результат. Вот сам пример.
PHP код:
#include <iostream>
#include <stdlib.h>
using namespace std;
class 
Complex{
private:
    
double re;
    
double im;
public:
    
Complex(){
           
re=0im=0;
    }
    
Complex(double re,double im)
    {
        
this->re=re;
        
this->im=im;
    }
    
Complex(Complex &c){
        
cout << "Copy\n";
        
re=c.reim=c.im;
    }
    
Complex operator=(const Complex &x){
        
cout << "=\n";
        
Complex c;
        
c.re=x.rec.im=x.im;
        
re=x.reim=x.im;
        return 
c;
    }
    
Complex operator*(const Complex &x){
        
Complex c;
        
c.re=this->re*x.re this->im*x.im;
        
c.im=this->im*x.re this->re*x.im;
        return 
c;
    }

    
friend Complex operator * (const double &d, const Complex &x);
};
Complex operator * (const double &d, const Complex &x){
    
Complex c;
    
c.re=x.re*dc.im=x.im;
    return 
c;
}
int main(int argccharargv[])
{
    
Complex c1(23);
    
Complex c2c3;
    
c3=c2=c1;
    
c1=c1*c2;
    
system("pause");
    return 
0;

В VS2010 он выдаёт
Цитата:
=
Copy
=
Copy
Copy
=
Copy
А в CodeBlock -
Цитата:
=
=
=
, т.е. конструктор копирования вообще не вызывается, только оператор присваивания. Из-за чего такая разница и что больше соответствует стандарту? Помогите разобраться, а то аспирант, ведущий у нас лабы, на мой вопрос ответить не смог.
DenisS0 вне форума Ответить с цитированием
Старый 04.12.2011, 16:50   #2
DenisS0
 
Регистрация: 22.03.2010
Сообщений: 4
По умолчанию

Оператор умножения double на Complex здесь ни при чём, остался от первого варианта лабы.
DenisS0 вне форума Ответить с цитированием
Старый 04.12.2011, 17:19   #3
_Ч_
Форумчанин
 
Регистрация: 07.01.2010
Сообщений: 141
По умолчанию

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

В коде у вас оператор копирования и оператор умножения возвращает Complex. Чтобы его вернуть, строится копия.
Итого на три оператора копирования и один оператор умножения получается 4 конструктора копирования. Но так как в вашей ситуации компилятор имеет всю инфу для оптимизации, он это и делает. И все это вроде соответствует стандарту.

Последний раз редактировалось _Ч_; 04.12.2011 в 17:33.
_Ч_ вне форума Ответить с цитированием
Старый 04.12.2011, 17:39   #4
DenisS0
 
Регистрация: 22.03.2010
Сообщений: 4
По умолчанию

Спасибо, я всё понял.
DenisS0 вне форума Ответить с цитированием
Старый 05.12.2011, 10:41   #5
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,709
По умолчанию

Цитата:
Скорее всего имеет место оптимизация. Разные IDE по разному это делают.
IDE этого не делают, делают компиляторы...
p51x вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Оператор присваивания Slunkin Паскаль, Turbo Pascal, PascalABC.NET 3 14.01.2011 17:53
Оператор присваивания BaNNeD Помощь студентам 2 14.12.2010 17:39
Оператор присваивания Lotles Общие вопросы C/C++ 2 12.10.2010 20:48
Оператор присваивания Superlotles Общие вопросы C/C++ 15 12.07.2010 16:46