C Primer 第五版 16 1 6節練習

2021-09-25 16:21:54 字數 3021 閱讀 2591

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 編寫一段程式讀入兩個字串,比較其是否相等並輸出結果。如果不相等,輸出較大的那個字串。改寫上述程式,比較輸入的兩...