оператор присвоение и конструктор копии
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;
}