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成員。