码迷,mamicode.com
首页 > 编程语言 > 详细

C++primer 13.6.3节练习

时间:2017-09-06 20:43:44      阅读:248      评论:0      收藏:0      [点我收藏+]

标签:turn   operator   span   bsp   back   stream   except   prim   地址   

练习13.55

1 void push_back(const string& s) &&;

练习13.56

此时拷贝一个副本,但是问题来了,ret是一个左值,返回他的sorted函数,会不停的进行递归自己,而该函数并没有一个终止条件,所以最后堆栈会溢出,导致程序异常终止;

练习13.57

此时函数返回的是一个临时对象的sorted函数,而临时对象是一个右值,这时会调用右值的sorted重载函数,程序正常运行,但是原对象依然没有排序,因为他是一个const或者是一个左值,改变的只是临时对象的元素顺序,但是很遗憾,临时对象在函数运行完就被销毁了。注意一点,上一题的是一个左值,他作用于整个函数体作用域。简单来说他是有地址的。

练习13.58

  1 #include <iostream>
  2 #include <string>
  3 #include <memory>
  4 #include <vector>
  5 #include <algorithm>
  6 #include <numeric>
  7 
  8 using namespace std;
  9 
 10 class Foo {
 11     friend void print(const Foo &);
 12 public:
 13     Foo();
 14     Foo(vector<int> &a);
 15     Foo(const Foo&);
 16     Foo& operator=(const Foo&);
 17     Foo(Foo &&) noexcept;
 18     Foo & operator=(Foo&& ) noexcept;
 19     Foo sorted() const &;
 20     Foo sorted() &&;
 21 private:
 22     vector<int> data;
 23 };
 24 
 25 void print(const Foo &);
 26 
 27 int main()
 28 {
 29     vector<int> vec{ 1,3,5,2,6,3,7,4,0 };
 30     Foo f1;
 31     Foo f2(vec);
 32     print(f1);
 33     print(f2);
 34     f1 = std::move(f2);
 35     print(f1);
 36     print(f2);
 37     Foo f3(vec);
 38     print(f3.sorted());
 39     //print(std::move(f3).sorted());
 40     print(f3);
 41     system("pause");
 42     return 0;
 43 }
 44 
 45 Foo::Foo()
 46 {
 47     vector<int> data1(10, 0);
 48     data = data1;
 49 }
 50 
 51 Foo::Foo(vector<int>& a)
 52 {
 53     data = a;
 54 }
 55 
 56 Foo::Foo(const Foo &f)
 57 {
 58     data = f.data;
 59 }
 60 
 61 Foo & Foo::operator=(const Foo &f)
 62 {
 63     data = f.data;
 64     return *this;
 65     // TODO: 在此处插入 return 语句
 66 }
 67 
 68 Foo::Foo(Foo &&f) noexcept
 69 {
 70     data = std::move(f.data);
 71 }
 72 
 73 Foo & Foo::operator=(Foo &&f) noexcept
 74 {
 75     data = std::move(f.data);
 76     return *this;
 77     // TODO: 在此处插入 return 语句
 78 }
 79 
 80 Foo Foo::sorted() const &
 81 {
 82     Foo ret(*this);
 83     /*sort(ret.data.begin(), ret.data.end());
 84     cout << "1" << endl;*/
 85     cout << &ret << endl;
 86     return ret.sorted();
 87     //return Foo(*this).sorted();
 88 }
 89 
 90 Foo Foo::sorted() &&
 91 {
 92     sort(data.begin(), data.end());
 93     cout << "0" << endl;
 94     return *this;
 95 }
 96 
 97 void print(const Foo &f)
 98 {
 99     for (auto c : f.data)
100         cout << c << " ";
101     cout << endl;
102 }

 

C++primer 13.6.3节练习

标签:turn   operator   span   bsp   back   stream   except   prim   地址   

原文地址:http://www.cnblogs.com/wuyinfenghappy/p/7486774.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!