首页 > 心得笔记 > 【笔记迁移】C++Primer笔记 2010/9/9

【笔记迁移】C++Primer笔记 2010/9/9

2012年2月26日  2,356 views 发表评论 阅读评论

Google的NoteBook这回是真的要没了,以前上学时在NoteBook上做了一些笔记,现在都已经被直接导入到Google Docs里了,因为Google Docs不是那么好访问,现在就将之前的这些笔记都迁移到这里来,现在再看这些笔记,有些自己都有点看不懂了。若有时间的话应该再整理一下。

参加工作半年多了,自从去年9月份开始就没有再更新过这个博客了,若不是前几天域名商发邮件提醒我续费,没准已经将这个博客给遗忘了……唉,生活是艰苦的,工作是忙碌的,无限怀念学生时代啊。

14章重载操作符与转换


1、自增自减操作符重载

自增自减的前缀式与后缀式的区分靠的是参数表中的int参数,这个形参是无用的,它唯一的目的是使后缀函数与前缀函数区分开来。后缀式写这个参数,前缀式没有。
自增自减操作符的后缀式重载时,应与内置操作符一致,返回旧值(即尚未自增或自减的值),并且返回值而不是引用。
示例:

前缀式 ClassType& operator++();

后缀式 ClassType operator++(int); // 一般情况下,后缀式用前缀式实现。


2、调用操作符重载()

定义了调用操作符的类,其对象常称为函数对象(Function Object),即它们是行为类似函数的对象。

struct absInt{
int operator() (int val){
return val<0?-val:val;
}
};
int i=42;
absInt absObj;
unsigned int ui = absObj(i);

3、标准库函数对象调用

标准库函数对象使用时要包含functional头文件,有算术函数对象类型、关系函数对象类型、逻辑函数对象类象,就是各种操作符的函数对象,例如plus<Type> 对应+。
用法:函数对象通常用于覆盖算法使用的默认操作符。如sort默认使用operator<按升序对容器进行排序。
如果要降序排列则可以传递函数对象greater。 示例:

sort(svec.begin(),svec.end(),greater<string>());

标准库函数对象


4、函数对象的函数适配器

函数对象的函数适配器有两类

  • 绑定器(binder),它通过讲一个操作数绑定到给定值而将二元函数对象转换为一元函数对象。有bind1st和bind2nd两个,bind1st将给定值绑定到二元函数对象的第一个实参,bind2nd绑定到第二个实参。
  • 求反器(negator),它将谓词函数对象的真值求反。有not1和not2两个,not1将一元函数对象的真值求反,not2将二元函数对象的真值求反。

示例:

//计算容器vec中所有小于或等于10的元素的个数。bind2nd后面等于 <=10,将二元函数对象变为一元。
count_if(vec.begin(), vec.end(), bind2nd(less_equal<int>(), 10) );

//计算容器vec中所有不是小于等于10的元素,即大于10的元素,not1将bind2nd(less_equal<int>(), 10)的返回值求反。
count_if(vec.begin(), vec.end(), not1(bind2nd(less_equal<int>(), 10) );

5、转换操作符

转换操作符(conversion operator)是一种特殊的类成员函数。它定义将类类型值转变为其他类型值的转换。转换操作符在类定义体内声明,在保留字operator之后跟着转换的目标类型。

通用形式:operator type();//没有返回值类型但是有返回值
这里,type表示内置类型名、类类型名或有类型别名所定义的名字。对任何可作为函数返回类型的类型除void外都可以定义转换函数。
转换函数必须是成员函数,不能指定返回值类型,并且形参表必须为空。
类类型转换之后不能再跟另一个类类型转换。如果需要多个类类型转换,则代码将出错。
转换操作符




声明:未作说明,则本文为代码至上原创。转载务必注明出处
注意:转载须保留全文,如需修改请 联系作者
本文永久地址:http://codeup.org/archives/462


我要分享到:

新浪微博 腾讯微博 人人 Twitter Facebook 网易微博 鲜果 Follow5
分类: 心得笔记 标签: , , ,