C Primer 第五版 16 1 2節練習

2021-09-25 08:02:11 字數 4664 閱讀 1900

16.9    函式模板是可以例項化出特定函式的模板,類模板是可以例項化出特定類的模板。

16.10    當類模板被例項化時,編譯器會根據提供的模板實參列表來繫結模板引數,替換類模板定義中模板引數出現的地方,這樣就例項化出乙個特定的類。

16.11    類模板的名字不是型別,只有例項化後才能形成型別。在class list**中不能直接使用listitem,應該使用listitem;在類模板作用域中,可以不提供實參,因此class list**中可以用list代替list。

16.12    blob和blobptr模板**:

#ifndef	blob_h

#define blob_h

#include #include #include #include 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();

blobptrbegin()

blobptrend()

t& front();

t& back();

t& operator(size_type i);

const t& front() const;

const t& back() const;

const t& operator(size_type i) const;

private:

shared_ptr> 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_shared>())

template blob::blob(initializer_listil):

data(make_shared>(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 bool operator==(const blobptr&, const blobptr&);

template class blobptr ;

blobptr(blob&a, size_t sz = 0):

wptr(a.data), curr(sz)

t& operator*() const

blobptr& operator++();

blobptr& operator--();

blobptr operator++(int);

blobptr operator--(int);

private:

shared_ptr> check(size_t, const string&) const;

weak_ptr> wptr;

size_t curr;

};template shared_ptr>

blobptr::check(size_t i, const string &msg) const

template blobptr& blobptr::operator++()

template blobptr& blobptr::operator--()

template blobptrblobptr::operator++(int)

template blobptrblobptr::operator--(int)

template bool operator==(const blobptr&lhs, const blobptr&rhs)

template bool operator!=(const blobptr&lhs, const blobptr&rhs)

#endif

16.13    選擇一對一友好關係。

16.14    screen類模板**:

#ifndef	screen_h

#define screen_h

#include using namespace std;

template class screen

screen(char c): contents(h * w, c)

char get() const

inline char get(pos, pos) const;

screen &move(pos r, pos c);

screen &set(char);

screen &display(ostream &os)

const screen &display(ostream &os) const

private:

pos cursor = 0;

string contents;

void do_display(ostream &os) const

};template inline screen&screen::set(char c)

template inline screen&screen::move(pos r, pos c)

16.15    新增輸入輸出運算子:

#ifndef	screen_h

#define screen_h

#include using namespace std;

template class screen;

template istream &operator>>(istream&, screen&);

template ostream &operator<<(ostream&, screen&);

template class screen ;

template istream &operator>>(istream &is, screen&s)

template ostream &operator<<(ostream &os, screen&s)

#endif

16.16    vec.**件定義vec模板:

#ifndef	vec_h

#define vec_h

#include using namespace std;

template class vec

vec(const vec&);

vec(const t*, const t*);

vec(initializer_listlst);

vec& operator=(const vec&);

~vec();

void push_back(const t&);

size_t size() const

size_t capacity() const

t *begin() const

t *end() const

void reserve(size_t n)

void resize(size_t);

t& operator(size_t n)

private:

static allocatoralloc;

void chk_n_alloc()

pairalloc_n_copy(const t*, const t*);

void free();

void reallocate();

t *elements;

t *first_free;

t *cap;

};template std::allocatorvec::alloc;

template void vec::push_back(const t &s)

template pairvec::alloc_n_copy(const t *b, const t *e)

template void vec::free()

}template vec::vec(const vec&s)

template vec::vec(const t *b, const t *e)

template vec::vec(initializer_listlst)

template vec::~vec()

template vec&vec::operator=(const vec &rhs)

template void vec::reallocate()

template void vec::resize(size_t n)

else if ( n < size() ) }

#endif

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