16.28 重新定義未sp和up兩個模板:
#ifndef sp_h
#define sp_h
#include using namespace std;
template class sp
explicit sp(t *pt): p(pt), use(new size_t(1))
sp(const sp &sp): p(sp.p), use(sp.use)
sp& operator=(const sp&);
~sp();
t& operator*()
t& operator*() const
private:
t *p;
size_t *use;
};template sp& sp::operator=(const sp &rhs)
} if (rhs.use)
++*rhs.use;
p = rhs.p;
use = rhs.use;
return *this;
}template sp::~sp() }}
template spmake_sp(args&&... args)
template class up
up(const up &up) = delete;
explicit up(t* pt) : p(pt) {}
up& operator=(const up&) = delete;
~up();
t* release();
void reset(t *new_p);
t& operator*()
t& operator*() const
private:
t *p;
};template up::~up()
template t* up::release()
template void up::reset(t *new_p)
#endif
16.29 重新修改blob模板:
#ifndef blob_h
#define blob_h
#include #include #include #include #include "sp.h"
using namespace std;
template class blobptr;
template class blob
bool empty() const
void push_back(const t &t)
void push_back(t &&t)
void pop_back();
t& front();
t& back();
t& operator(size_type i);
const t& front() const;
const t& back() const;
const t& at(size_type) const;
const t& operator(size_type i) const;
private:
sp> data;
void check(size_type i, const string &msg) const;
};template void blob::check(size_type i, const string &msg) const
template blob::blob(): data(make_sp>())
template blob::blob(initializer_listil):
data(make_sp>(il))
template void blob::pop_back()
template t& blob::front()
template t& blob::back()
template t& blob::operator(size_type i)
template const t& blob::front() const
template const t& blob::back() const
template const t& blob::operator(size_type i) const
template const t& blob::at(size_type i) const
#endif
16.30 測試主程式:
#include #include #include #include "sp_blob.h"
using namespace std;
int main()
; b1 = b2; // b1 and b2 share the same elements
b2.push_back("about");
cout << b1.size() << " " << b2.size() << endl;
} // b2 is destroyed, but the elements it points to must not be destroyed
cout << b1.size() << endl;
for(size_t i = 0; i < b1.size(); ++i)
cout << endl << endl;
upu1(new int(42));
cout << *u1 << endl;
upu2(u1.release());
cout << *u2 << endl;
return 0;
}
16.31 shared_ptr在執行時繫結刪除器,unique_ptr在編譯時繫結刪除器。對unique_ptr而言,刪除器型別是unique_ptr型別的一部分。通過這種方式,unique_ptr避免了間接呼叫刪除器的開銷,還可以將自定義的刪除器(debugdelete)編譯為內聯形式。 C Primer第五版 2 4 3節練習
練習2.30 對於下面的這些語句,請說明物件被宣告成了頂層const還是底層const?const int v2 0 v2的值不能被改變,所以這是乙個頂層const int v1 v2 int p1 v1,r1 v1 const int p2 v2 p2存放的是v2的位址,不能間接改變v2的值,但p...
C Primer第五版 2 5 3節練習
練習 2.36 關於下面的 請指出乙個變數的型別以及程式結束時它們各自的值。include int main 練習 2.37 賦值是會產生引用的一類典型表示式,引用的型別就是左值的型別。也就是說,如果i是int,則表示式 i x的型別是int 根據這一特點,請指出下面的 中每乙個變數的型別和值。in...
C Primer第五版 3 2 2節練習
練習3.2 編寫一段程式從標準輸入中一次讀入一整行,然後修改該程式使其一次讀入乙個詞。練習3.3 請說明string類的輸入運算子和getline函式分別是如何處理空白字元的。練習 3.4 編寫一段程式讀入兩個字串,比較其是否相等並輸出結果。如果不相等,輸出較大的那個字串。改寫上述程式,比較輸入的兩...