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