Advertisement
avr39ripe

PV913MoveSemanticsSolution

Jun 10th, 2020
129
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 5.64 KB | None | 0 0
  1. #include <iostream>
  2. #include <chrono>
  3.  
  4.  
  5. class String
  6. {
  7.     char* str;
  8.     uint32_t size;
  9. public:
  10.     String(const char* strP)
  11.         : str{ new char[strlen(strP) + 1] }, size{ strlen(strP) }
  12.     {
  13.         strcpy_s(str, size+1, strP);
  14.     };
  15.  
  16.     ~String() { delete[] str; };
  17.  
  18.     String& operator=(const char* strP)
  19.     {
  20.         delete[] str;
  21.         str = new char[strlen(strP) + 1];
  22.         size = strlen(strP);
  23.         strcpy_s(str, size+1, strP);
  24.         return *this;
  25.     };
  26.  
  27.     friend std::ostream& operator<<(std::ostream& out, const String& rhs)
  28.     {
  29.         out << rhs.str;
  30.         return out;
  31.     }
  32. };
  33.  
  34.  
  35. class Number
  36. {
  37.     int num;
  38. public:
  39.     Number(int numP) : num{ numP } { std::cout << "Number constructed for " << this << " with value " << num << '\n'; }
  40.     Number() : Number{ 0 } {};
  41.     Number& operator=(const int rhs) { num = rhs; std::cout << "Number assigned for " << this << " with value " << num << '\n'; return *this; }
  42.     friend std::ostream& operator<<(std::ostream& out, const Number& rhs)
  43.     {
  44.         out << "Number: " << rhs.num;
  45.         return out;
  46.     }
  47.     ~Number() { std::cout << "Number destructed for " << this << " with value " << num << '\n'; };
  48. };
  49.  
  50. class TestNum
  51. {
  52.     Number num;
  53.     int _initNum(int max) { return rand() % max; };
  54. public:
  55.     TestNum() { num = _initNum(11);  std::cout << "TestNum constructed for " << this << '\n'; };
  56.     ~TestNum() { std::cout << "TestNum destructed for " << this << '\n'; }
  57. };
  58.  
  59. class DynArray
  60. {
  61.     int* arr;
  62.     int size;
  63. public:
  64.     DynArray(int pSize) : arr{ new int[pSize] {} }, size{ pSize } {std::cout << "DynArr constructed for " << size << " elements, for " << this << '\n'; };
  65.     DynArray() : DynArray(5) {};
  66.     //COPY
  67.     DynArray(const DynArray& obj);
  68.     DynArray& operator=(const DynArray& obj);
  69.     //MOVE
  70.     DynArray(DynArray&& obj);
  71.     DynArray& operator=(DynArray&& obj);
  72.  
  73.     int getElem(int idx) { return arr[idx]; };
  74.     void setElem(int idx, int val) { arr[idx] = val; };
  75.     void print();
  76.     void randomize();
  77.     ~DynArray()
  78.     {
  79.         if (arr)
  80.         {
  81.             std::cout << "this->arr = " << this->arr << '\n';
  82.             delete[] arr;
  83.         };
  84.         std::cout << "DynArr destructed for " << size << " elements, for " << this << '\n';
  85.     };
  86. };
  87.  
  88. void DynArray::print()
  89. {
  90.     for (int i{ 0 }; i < size and arr; ++i)
  91.     {
  92.         std::cout << arr[i] << ' ';
  93.     }
  94.     std::cout << '\n';
  95. }
  96.  
  97. void DynArray::randomize()
  98. {
  99.     for (int i{ 0 }; i < size; ++i)
  100.     {
  101.         arr[i] = rand() % 10;
  102.     }
  103. }
  104.  
  105. DynArray::DynArray(const DynArray& obj)
  106.     : arr{ new int[obj.size] {} }, size{ obj.size }
  107. {
  108.     for (int i{ 0 }; i < size; ++i)
  109.     {
  110.         arr[i] = obj.arr[i];
  111.     };
  112.  
  113.     std::cout << "DynArr COPY constructed for " << size << " elements, for " << this << '\n';
  114. };
  115.  
  116.  
  117.  
  118. DynArray::DynArray(DynArray&& obj)
  119.     : arr{ obj.arr}, size{ obj.size }
  120. {
  121.     obj.arr = nullptr;
  122.     obj.size = 0;
  123.  
  124.     std::cout << "DynArr MOVE constructed for " << size << " elements, for " << this << '\n';
  125. };
  126.  
  127. DynArray& DynArray::operator=(DynArray&& obj)
  128. {
  129.     if (this == &obj)
  130.     {
  131.         std::cout << "DynArr self assign in MOVE PREVENTED! for " << this << '\n';
  132.         return *this;
  133.     }
  134.  
  135.     delete[] arr;
  136.  
  137.     arr = obj.arr;
  138.     size = obj.size;
  139.  
  140.     obj.arr = nullptr;
  141.     obj.size = 0;
  142.  
  143.     std::cout << "DynArr MOVE assigned for " << size << " elements, for " << this << '\n';
  144.     return *this;
  145. };
  146.  
  147. void printDynArrEl(DynArray& arr, int idx)
  148. {
  149.     std::cout << arr.getElem(idx) << ' ';
  150. }
  151.  
  152.  
  153. DynArray mkArray(int size)
  154. {
  155.     DynArray arrInternal{ size };
  156.     arrInternal.randomize();
  157.     return arrInternal;
  158. }
  159.  
  160. int max(int a, int b)
  161. {
  162.     return a > b ? a : b;
  163. }
  164.  
  165. void rvalDemo(int& num)
  166. {
  167.     std::cout << "L-Value version!!! " << num << '\n';
  168. }
  169.  
  170. void rvalDemo(int&& num)
  171. {
  172.     std::cout << "R-Value version!!! " << num << '\n';
  173. }
  174.  
  175.  
  176. int main()
  177. {
  178.     /*l - value
  179.     r - value*/
  180.  
  181.     //int num1{ 10 };
  182.     //int num2{ 23 };
  183.  
  184.     //rvalDemo(num1);
  185.  
  186.     //rvalDemo(std::move(num1));
  187.  
  188.     ////int& numRef{ max(num1,num2) };
  189.  
  190.     //int&& numRvalRef{ max(num1,num2) };
  191.  
  192.     //std::cout << numRvalRef << '\n';
  193.  
  194.     //numRvalRef = 789;
  195.  
  196.     //std::cout << numRvalRef << '\n';
  197.  
  198.  
  199.  
  200.     //numRef = 5555;
  201.  
  202.     //max(num1, num2) = 555;
  203.  
  204.  
  205.       /*  int x{34};
  206.         int* ptr = new int{ 444 };
  207.  
  208.         *ptr
  209.  
  210.         x = 56;
  211.  
  212.         int y{};
  213.  
  214.         y = x;*/
  215.  
  216.  
  217.     //DynArray arrExternal{};
  218.  
  219.     //arrExternal = mkArray(7);
  220.     ////arrExternal = DynArray{7};
  221.  
  222.     //arrExternal.print();
  223.  
  224.     DynArray arr1{ 7 };
  225.     arr1.randomize();
  226.     arr1.print();
  227.  
  228.     std::cout << "Create copy of arr1 in arr2!\n";
  229.     DynArray arr2{ std::move(arr1) };
  230.     arr2.print();
  231.  
  232.     std::cout << "Arr1 still alive and fully functional!\n";
  233.     arr1.print();
  234.     arr1 = DynArray{4};
  235.     arr1.print();
  236.  
  237.  
  238.     //String str{ "Initial string!" };
  239.     //std::cout << str << '\n';
  240.     //str = "Some new string";
  241.     //std::cout << str << '\n';
  242.  
  243.  
  244.     /*srand(time(nullptr));
  245.     TestNum tn;*/
  246.  
  247.     //Number n{333};
  248.     //n = 42;
  249.     //std::cout << n << '\n';
  250.      //int x{ 42 };
  251.     //x = x;
  252.  
  253.     //std::cout << "X = " << x << '\n';
  254.     //return 0;
  255. /*
  256.     std::cout << "arr1 creation\n";
  257.     DynArray arr1{8};
  258.     arr1.print();
  259.     arr1.randomize();
  260.     arr1.print();
  261.     std::cout << "arr2 creation\n";
  262.     DynArray arr2{};
  263.     arr2.randomize();
  264.     arr2.print();
  265.     arr2 = arr1; // { arr2.arr = arr1.arr; arr2.size = arr1.size; }
  266.     arr2.print();
  267.  
  268. */
  269.  
  270.     //DynArray arr{};
  271.     //arr = mkArray(8);
  272.     //arr.print();
  273.  
  274. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement