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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值