оператор присвоение и конструктор копии

Complex myC(3, 3);
Complex myJ = myC;

вот так вызывается как я и хотел конструктор копирования

myC = myA + myB;

А так он, походу, сумму myA + myB заносит во временно созданный объект, но при этом в перегруженном операторе + тоже при возврате используется временный объект.

но все равно не понимаю почему

Complex myJ = myA + myB;

используется стандартный конструктор, без оператора присвоения и без конструктора копирования

весь код:

#include <iostream>
#include <math.h> 
#include <time.h>
#include <stdlib.h>
using namespace std;

enum OperationView {PLUS, MINUS};
const char* OperationViewName[] = {"сложение", "вычитание"};


class Object
{
    static int nextId; // следующий присваиваемый номер
    static int curAlive; //текущее кол-во экземпляров данного класса
    int id;
    int curEl;
    int curSize;
    char** arr;
    
public:
    Object() 
    {
        cout<<endl<<"simple ctor!"<<endl;
        id = nextId++;
        ++curAlive;
        curSize = 10;
        arr = new char*[curSize];
        for(int i = 0; i < curSize; ++i)
            arr[i] = (char *) "";
        curEl = 0;
    }
    
    Object(const Object& otherObj) 
    {
        cout<<endl<<"copy ctor!"<<endl;
        id = nextId++;
        ++curAlive;
        curSize = otherObj.curSize;
        arr = new char*[curSize];
        for(int i = 0; i < curSize; ++i)
            arr[i] = otherObj.arr[i];
        curEl = otherObj.curEl;
    }
    
    ~Object() 
    {
        --curAlive;
        delete[] arr;
    }
    
    Object operator= (const Object& otherObj)
{
    cout<<endl<<"oper prisvo!"<<endl;
    this->clearOp();
    curSize = otherObj.curSize;
        arr = new char*[curSize];
        for(int i = 0; i < curSize; ++i)
            arr[i] = otherObj.arr[i];
        curEl = otherObj.curEl;
    return *this;
}
    
    void addOp(OperationView a)
    {
        if (curEl == curSize)
        {
            int newSize;
            newSize = curSize + 10;
            //curSize *= 2;
            char** tmpArr = new char*[newSize];
            for(int i = 0; i < newSize; ++i)
            {
                if (i <= curSize)
                {
                    tmpArr[i] = arr[i];
                }
                else
                {
                    tmpArr[i] = (char *) "";
                }
            }
            delete[] arr;
            arr = tmpArr;
            curSize = newSize;
        }
        arr[curEl] = (char *) OperationViewName[a];
        curEl++;
    }
    
    void clearOp()
    {
        delete[] arr;
        curSize = 10;
        arr = new char*[curSize];
        for(int i = 0; i < curSize; ++i)
            arr[i] = (char *) "";
        curEl = 0;
    }
    
    void printOp()
    {   
        if (arr[0] != "")
        {
            cout << "Для объекта № " << id << " выполнены следующие действия:" << endl;
            for(int i = 0; i < curSize; ++i)
            cout << arr[i] << " ";
        }
        else
        {
            cout << "С объектом № " << id << " не выполнялись операции." << endl;
        }
        cout << endl;
    }
    
    void print()
    {
        cout << "Объект №" << id << endl;
    }
    
    //статический метод выводит информацию по кол-ву объектов класса
    static void printTotalInfo()
    {
        cout << "Было создано " << nextId - 1 << " объектов. Сейчас активно:" << curAlive << endl;
    }
};

int Object::nextId = 1;
int Object::curAlive = 0;


class Complex : public Object
{
    float a, b;
    bool real;

public:
    
    Complex(float a, float b)
    {
        setA(a);
        setB(b);
        if (b == 0)
        {
            this->real = false;
        }
        else
        {
            this->real = true;
        }   
    }
    
    float getA()const { return a; }
    void setA(float a) { this->a = a; };
    float getB()const { return b; }
    void setB(float b)
    {
     this->b = b;
     if (b == 0)
        {
            this->real = false;
        }
        else
        {
            this->real = true;
        }   
     };
    bool getReal() { return real; }
    
    void invComplex()
    {
        this->b = -b;
    }
    
    
    void revComplex()
    {
        float oldA = this->a;
        this->a = this->a / ((this->a * this->a) + (this->b * this->b));
        this->b = float(((-1 * this->b)) / ((oldA * oldA) + (this->b * this->b)));
    }
    
    
    void printAbout()
    {
        char sign;
    if (b < 0)
    {
        sign = '-';
    }
    else
    {
        sign = '+' ;
    }
    cout << "(" << a << " " << sign << " " << fabs(b) << " * i) ";
    if (real)
    {
        cout << "[complex number]" << endl; 
    }
    else
    {
        cout << "[real number]" << endl;    
    }
    }   

    static Complex randomNum(float& a, float& b)
    {
        srand(time(NULL));
        if (a > b)
        {
            float c;
            c = b;
            b = a;
            a = c;  
        }
        float c = (float) rand() / RAND_MAX * (b - a) + a;
        float d = (float) rand() / RAND_MAX * (b - a) + a;
        cout << "чек" << endl;
        return Complex {c, d};
    }

};


Complex operator+ (Complex& a, Complex& b)
{
    a.addOp(PLUS);
    b.addOp(PLUS);
    return Complex { b.getA() + a.getA(), b.getB() + a.getB() };
}

Complex operator- (Complex& a, Complex& b)
{
    a.addOp(MINUS);
    b.addOp(MINUS);
    return Complex { a.getA() - b.getA(), a.getB() - b.getB() };
}

Complex operator* (const Complex& a, const Complex& b)
{
    return Complex { (a.getA() * b.getA()) - (a.getB() * b.getB()), (a.getA() * b.getB()) + (b.getA() * a.getB()) };
}

Complex operator/ (const Complex& a, const Complex& b)
{
    return Complex { ((a.getA() * b.getA()) + (a.getB() * b.getB())) / ((b.getA() * b.getA()) + (b.getB() * b.getB())), ((b.getA() * a.getB()) - (a.getA() * b.getB())) / ((b.getA() * b.getA()) + (b.getB() * b.getB())) };
}

 



int main()
{
    system("chcp 1251");
    Complex myA(1, 1);
    Complex myB(-2, -1);
    myA.printAbout();
    myB.printAbout();
    //Complex myC = myA + myB;
    Complex myC(3, 3);
    myC.printAbout();
    Complex myJ = myC;
    myJ.printAbout();
    myC = myA - myB;
    //myC = myA - myB;
    //myC = myA - myB;
    //myC = myA - myB;
    //myC = myA - myB;
    //myC = myA - myB;
    //myC = myA - myB;
    //myC = myA - myB;
    //myC = myA - myB;
    //myC = myA - myB;
    //myC = myA + myB;
    //myC = myA + myB;
    //myC = myA + myB;
    myC.printAbout();
    myC.print();
    cout << endl;
    Complex::printTotalInfo();
    cout << "myK" << endl;
    Complex myK = myA + myB;
    myK.printAbout();
    myK.print();
    //Object a, v, c;
    //Object::printTotalInfo();
    Complex::printTotalInfo();
    
    //Complex:printOp(myA);
    //myA.addOp(1);
    myA.printOp();
    myB.printOp();
    myC.printOp();
    
    Complex myZ = myA;
    myC = myA + myB;
    myA.printAbout();
    myA.printOp();
    myA.print();
    myZ.printAbout();
    myZ.printOp();
    myZ.print();
    float a, b;
    a = -100; b = 100;
    //cin >> a;
    //cin >> b;
    Complex myD = Complex::randomNum(a, b);
     myD.printAbout();  myD.print();
    return 0;
}



Ответы (0 шт):