C++primer 13.3節練習

來源:互聯網
上載者:User

標籤:iostream   names   logs   already   size   str   特定   語句   new   

練習13.29

不會,因為該類中的資料成員都是內建類型的,而內建類型是沒有特定版本的swap的,所以對swap的調用會調用標準庫的std::swap;

練習13.30

 1 #include <iostream> 2 #include <string> 3 #include <memory> 4  5 using namespace std; 6  7  8 class HasPtr { 9     friend ostream &print(ostream &os, HasPtr &h);10     friend void swap(HasPtr &lhs, HasPtr &rhs);11 public:12     HasPtr(const string &s = string()) : ps(new string(s)), i(0) {}13     HasPtr(const HasPtr &ptr);14     HasPtr &operator=(const HasPtr &pt);15     ~HasPtr() { delete ps; }16 private:17     string *ps;18     int i;19 };20 21 ostream &print(ostream &os, HasPtr &h);22 inline void swap(HasPtr &lhs, HasPtr &rhs);23 24 int main()25 {26     HasPtr has("hello");27     HasPtr have = has;28     print(cout, have);29     HasPtr h1("world");30     swap(have, h1);31     print(cout, have);32     print(cout, h1);33     system("pause");34     return 0;35 }36 37 HasPtr::HasPtr(const HasPtr & ptr) : ps(new string(*(ptr.ps))), i(ptr.i) {}38 39 HasPtr & HasPtr::operator=(const HasPtr & pt)40 {41     ps = new string(*pt.ps);42     i = pt.i;43     return *this;44     // TODO: 在此處插入 return 語句45 }46 47 ostream & print(ostream & os, HasPtr & h)48 {49     os << *h.ps << h.i << endl;50     return os;51     // TODO: 在此處插入 return 語句52 }53 54 inline void swap(HasPtr & lhs, HasPtr & rhs)55 {56     swap(lhs.ps, rhs.ps);57     cout << "ps already copy" << endl;58     swap(lhs.i, rhs.i);59     cout << "i already copy" << endl;60 }

練習13.31

 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 HasPtr {11     friend ostream &print(ostream &os, HasPtr &h);12     friend void swap(HasPtr &lhs, HasPtr &rhs);13     friend bool operator<(HasPtr &lpt, HasPtr &rpt);14     friend string & out(HasPtr &pt);15 public:16     HasPtr(const string &s = string()) : ps(new string(s)), i(0) {}17     HasPtr(const HasPtr &ptr);18     HasPtr &operator=(const HasPtr &pt);19     ~HasPtr() { delete ps; }20     21 private:22     string *ps;23     int i;24 };25 26 ostream &print(ostream &os, HasPtr &h);27 inline void swap(HasPtr &lhs, HasPtr &rhs);28 bool operator<(HasPtr &lpt, HasPtr &rpt);29 string & out(HasPtr &pt);30 31 int main()32 {33     vector<HasPtr> svec;34     string word;35     while (cin >> word)36     {37         svec.push_back(*new HasPtr(word));38     }39     sort(svec.begin(), svec.end());40     for (auto c : svec)41     {42         cout << out(c) << endl;43     }44     system("pause");45     return 0;46 }47 48 HasPtr::HasPtr(const HasPtr & ptr) : ps(new string(*(ptr.ps))), i(ptr.i) {}49 50 HasPtr & HasPtr::operator=(const HasPtr & pt)51 {52     auto q = new string(*pt.ps);53     delete ps;54     ps = q;55     i = pt.i;56     return *this;57 }58 59 string & out(HasPtr & pt)60 {61     return *pt.ps;62 }63 64 bool operator<(HasPtr & lpt, HasPtr &rpt)65 {66     return (*lpt.ps).size() < (*rpt.ps).size();67 }68 69 ostream & print(ostream & os, HasPtr & h)70 {71     os << *h.ps << h.i << endl;72     return os;73 }74 75 inline void swap(HasPtr & lhs, HasPtr & rhs)76 {77     using std::swap;78     swap(lhs.ps, rhs.ps);79     cout << "ps already copy" << endl;80     swap(lhs.i, rhs.i);81     cout << "i already copy" << endl;82 }

何時調用的swap函數不得而知。(疑問)

練習13.32

相比於類值版本的swap函數,指標版本交換的資料成員原本就是指標和整型,並沒有最佳化的效果,所以應該沒有得到益處。

 

C++primer 13.3節練習

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.