Hello, I am writing a class for working with sets. I use an overload of an assignment operator and a copy, as well as an overload of an assignment and a copy with "transfer". Ie only 4 overload. I did a program tracing, but I could not figure out at what point the copy statement or the copy transfer statement with "transfer" occurs (how the program decides what to use) and the like. Not everything is so simple with these overloads, I hope for a detailed answer.

#include "stdafx.h" #include <iostream> #include <cstring> #include <cstdlib> #include <ctime> using namespace std; class Set { static int len; //Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… мноТСств int n; //ΠœΠΎΡ‰Π½ΠΎΡΡ‚ΡŒ мноТСства static bool mode; //0 ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹ΠΉ Ρ€Π΅ΠΆΠΈΠΌ, 1 Ρ€Π΅ΠΆΠΈΠΌ трассировки static int U; //ΠœΠΎΡ‰Π½ΠΎΡΡ‚ΡŒ унивСрсума char litera; //ΠžΠ±ΠΎΠ·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ мноТСства A,B,C,D... char* universe; //Π£ΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° мноТСство public: Set(char _litera); ~Set(); Set(); void print(); int power() { return n; } //ΠžΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ Π½Π°Π΄ мноТСствами Set operator & (const Set& B) const; Set operator ~ () const; //ΠŸΠ΅Ρ€Π΅Π³Ρ€ΡƒΠ·ΠΊΠ° ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠ² ΠΊΠΎΠΏΠΈΠΈ ΠΈ присваивания Set(const Set &); Set operator = (const Set&); //ΠŸΠ΅Ρ€Π΅Π³Ρ€ΡƒΠ·ΠΊΠ° ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠ² ΠΊΠΎΠΏΠΈΠΈ ΠΈ присваивания с пСрСносом Set(Set &&); Set operator = (Set &&); }; Set::Set() : litera('D' + (len++)), n(0), universe(new char[U + 1]) { if (mode) cout << "Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ мноТСства " << litera << " = []\n"; universe[0] = '\0'; }; Set ::~Set() { if(mode) cout << "Π£Π΄Π°Π»Π΅Π½ΠΈΠ΅ мноТСства " << litera << '\n'; delete[] universe; } Set::Set(char _litera) : litera(_litera), n(0), universe(new char[U + 1]) { for (int i = 0; i < U; i++) { if (rand() % 2) { universe[n++] = '0' + i; } } universe[n] = '\0'; cout << "Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ мноТСства " << litera << " = [" << universe << "]\n"; } void Set::print() { cout << litera << " = [" << universe << "]" << '\n'; } //ΠžΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ Π½Π°Π΄ мноТСствами Set Set:: operator & (const Set& B) const { Set C; for (int i = 0; i < n; i++) { for (int j = 0; j < Bn; j++) { if (universe[i] == B.universe[j]) C.universe[C.n++] = universe[i]; } } C.universe[Cn] = '\0'; if(mode) cout << "Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ пСрСсСчСния мноТСства " << litera << " = [" << universe << "]" << " со мноТСством " << B.litera << " = [" << B.universe << "]" << " => " << C.litera << " = [" << C.universe << "]\n"; return C; } Set Set:: operator ~ () const { Set C; for (char ch = '0'; ch <= '9'; ch++) { bool flag = true; for (int j = 0; j < n; j++) { if (ch == universe[j]) { flag = false; break; } } if (flag) C.universe[C.n++] = ch; } C.universe[Cn] = '\0'; if(mode) cout << "Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ инвСрсии мноТСства " << litera << " = [" << universe << "]" << " => " << C.litera << " = [" << C.universe << "]\n"; return C; } //ΠŸΠ΅Ρ€Π΅Π³Ρ€ΡƒΠ·ΠΊΠ° ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΠ² ΠΊΠΎΠΏΠΈΠΈ ΠΈ присваивания Set::Set(const Set & B) : n(Bn), litera(B.litera), universe(new char[U + 1]) { if (mode) cout << "ΠšΠΎΠ½ΡΡ‚Ρ€ΡƒΠΊΡ‚ΠΎΡ€ копирования мноТСства " << B.litera << '\n'; memcpy(universe, B.universe, U + 1); } Set Set :: operator = (const Set& B) { if(mode) cout << "ΠšΠΎΠ½ΡΡ‚Ρ€ΡƒΠΊΡ‚ΠΎΡ€ присваивания " << litera << " = " << B.litera << '\n'; if (this != &B) { n = Bn; memcpy(universe, B.universe, U + 1); litera = 'R'; } return *this; } //ΠŸΠ΅Ρ€Π΅Π³Ρ€ΡƒΠ·ΠΊΠ° ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΠ² ΠΊΠΎΠΏΠΈΠΈ ΠΈ присваивания с пСрСносом Set::Set(Set && B) : litera('D'+(len++)),n(Bn), universe(B.universe){ if (mode) cout << "ΠšΠΎΠ½ΡΡ‚Ρ€ΡƒΠΊΡ‚ΠΎΡ€ копирования мноТСства " << litera << " ΠΈΠ· мноТСства " << B.litera << " с пСрСносом\n"; B.universe = NULL; } Set Set:: operator = (Set&& B) { if(mode) cout << "ΠšΠΎΠ½ΡΡ‚Ρ€ΡƒΠΊΡ‚ΠΎΡ€ присваивания c пСрСносом " << litera << " = " << B.litera << '\n'; if (this != &B) { n = Bn; universe = B.universe; litera = 'R'; B.universe = NULL; } return *this; } const unsigned int N = 1; int Set::U = 10; //ΠœΠΎΡ‰Π½ΠΎΡΡ‚ΡŒ унивСрсума для дСсятичных Ρ†ΠΈΡ„Ρ€ bool Set::mode = 1; //0 ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹ΠΉ Ρ€Π΅ΠΆΠΈΠΌ, 1 Ρ€Π΅ΠΆΠΈΠΌ трассировки int Set::len = 1; //Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… мноТСств; int main() { setlocale(LC_ALL, ""); srand(time(NULL)); time_t start, stop; { Set A('A'), B('B'), C('C'), D('D'), E; system("pause"); //ΠžΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° мноТСств start = clock(); for (int i = 0; i < N; i++) { E = ((A & ~(B & C)) & ~D); } stop = clock(); //Π’Ρ‹Π²ΠΎΠ΄ всСх мноТСств A.print(); B.print(); C.print(); D.print(); E.print(); //Π’Ρ‹Π²ΠΎΠ΄ срСднСй мощности ΠΈ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ cout << "Average power = " << (A.power() + B.power() + C.power() + D.power() + E.power()) / 5 << '\n'; cout << "Time = " << stop - start << '/' << N << '\n'; } system("pause"); return 0; } 

Program tracing

    0