c++primer學習筆記(二)

1.       const成員函數返回*this

在普通的非const成員函數中,this的類型是一個指向類類型的const指針,可以改變this所指向的值,但不能改變this所保存的地址。在const成員函數中,this的類型是一個指向const類類型的const指針,既不能改變this所指向的對象,也不能改變this所保存的地址。

基於const可以重載成員函數。

2.       可變數據成員使用mutable聲明,可以在任何成員函數中改變(包括const)。

3.       沒有默認構造函數的類類型,const或引用類型的數據成員,必須在構造函數初始化列表中初始化。成員初始化的順序就是定義成員的順序。

4.       類成員聲明的查找

類成員定義中的名字查找

5.       c++支持兩種初始化:直接初始化和複製初始化,複製初始化使用=符號,直接初始化將初始化式放在圓括號中。

string null_book=”9-9999”;       //複製初始化

string dots(10,’.’);

string empty_copy = string();

string empty_direct;

ifstream file1(“filename”);                 //直接初始化

ifstream file1 = “filename”;                //複製初始化,錯誤

6.       下標操作符重載

必須定義爲類成員函數。類定義下標操作符時,一般需要定義兩個版本:一個味非const成員並返回引用,另一個爲const成員並返回const引用。

class Foo{

public:

int & operate[](const size_t);

const int& operator[](const size_t) const;

private:

vector<int> data;

};

int & Foo::operate[](const size_t index)

{

         return data[index];

}

const int & Foo::operate[](const size_t index)const

{

         return data[index];

}

 

7.       自增自減操作符重載

class CheckedPtr{

public:

CheckedPtr(int* b,int* e):beg(b),cur(b),end(e){}

CheckedPtr& operator++();

CheckedPtr& operator--();

 

private:

int* beg;

int* end;

int* cur;

};

CheckedPtr& CheckedPtr::operator++()

{

           if(curr == end)

                    throw out_of_range(“increment past of the end of CheckedPtr”);

++cur;

           return *this;

}

CheckedPtr& CheckedPtr::operator--()

{

           if(curr == beg)

                    throw out_of_range(“decrement past of the beginning of CheckedPtr”);

--cur;

           return *this;

}

爲了區別操作符的前綴和後綴形式,後綴式操作符函數接受一個額外的int形參,使用後綴式操作符時,編譯器提供0作爲這個形參的實參。

class CheckedPtr{

public:

CheckedPtr operator++(int);

CheckedPtr operator--(int);

};

爲了與內置操作符一致,後綴式操作符應返回舊值(尚未自增自減的值),並且應返回值,而不是引用。

CheckedPtr CheckedPtr::operator++(int)

{

         CheckedPtr ret(*this);

           ++*this;

           return ret;

}

CheckedPtr CheckedPtr::operator--(int)

{

         CheckedPtr ret(*this);

           --*this;

           return ret;

}

 

 

8.       調用操作符和函數對象

struct absInt{

int operator()(int val)

{

return val<0?-val:val;

}

int i=-42;

absInt absObj;

unsigned ui = absObj(i);

函數調用操作符必須定義爲成員函數,一個類可以定義調用操作符的多個版本,由形參的樹目和類型加以區別。

9.       轉換操作符

轉換操作符是一種特殊的類成員函數,它定義將類類型值轉變爲其他類型值的轉換。

class SmallInt{

public:

SmallInt(int i=0):val(i)

{

           if(i<0 || i>255)

                    throw out_of_range(“bad smallint init”);

}

operator int() const{ return val;}

private:

std::size_t val;

}

轉換函數必須是成員函數,不能指定返回類型,並且形參表必須爲空,通常定義爲const成員。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章