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