《STL源码剖析》学习-- 1.9-- 可能令你困惑的C++语法2
2014-01-21 09:34
381 查看
上一篇请见可能令你困惑的C++语法1
现在继续,
2.临时对象的产生和运用
临时对象,是一种无名对象。制造临时对象的方法是,在型别之后加一对小括号,并可以给定初值,这样就会调用响应的constructor。在stl中,往往与仿函数一起使用,这样为了使程序看起来干净。
3.静态成员初始化问题
静态非const成员初始化,是在类定义内声明,类外定义时设定初值初始化;
静态const成员初始化,在类定义内直接初始化。
4.自增自减的前置与后置
C++中使用++和--,根据出现在对象的前面或者后面来进行调用。其实是根据函数重载来实现的,当编译器看到++a时,就调用operator++(a),当看到a++时,就调用operator(a,int)。这里编译器为int传递一个哑元常量值(因为此值永远也不会被使用),用来给后缀产生不同的标记。
使用示例如下,这是在类T中的代码:
5.stl中区间表示[ )
区间采用前闭后开的表示方法。[first,last),包含的元素范围为[first,last-1)。
6.仿函数
仿函数就是类似函数的结构体或者类。要把某类当做仿函数使用,类必须进行operator()重载,这是就可以像使用函数一样使用。
这里也加入第7章的内容,记录一下仿函数。
许多stl算法提供两个版本,一个用于一般状况,一个用于特殊状况。在特殊状况时,需要用户指定某个条件或者策略,而条件或者策略的背后由一整组操作构成。
在stl中,这一整组操作就是指的仿函数。一般的函数,如果当做参数传递,只有通过函数指针,但是指针无法只有自己的状态,更重要的一点是函数指针不能满足stl对抽象性的要求,所以达不到stl组件的可适配性。
仿函数根据函数参数可以分别为一元仿函数(unary_function)和二元仿函数(binary_function),用户自定义仿函数必须继承其中的一个。
下面是一元仿函数的参数型别和返回值类型,二元仿函数类似。
根据功能分为算术类(Arithmetic)仿函数、关系运算类(Rational)仿函数和逻辑运算类(Logical)仿函数,这些仿函数也都继承自一元或者二元仿函数。
这里要清楚几个概念,
证同元素,所谓“运算op的证同元素”,即数值与某个元素做op运算,会得到自己,则该元素则为该运算符的证同元素。
证同函数,任何数值通过此函数后,都不会有任何改变。
选择函数,接受一个pair,传回第一个或者第二个值。
投射函数,传回一个参数,忽略另外一个。
现在继续,
2.临时对象的产生和运用
临时对象,是一种无名对象。制造临时对象的方法是,在型别之后加一对小括号,并可以给定初值,这样就会调用响应的constructor。在stl中,往往与仿函数一起使用,这样为了使程序看起来干净。
template <typename T> class print{ public: void operator(){const T& elem){ cout << elem << ' '; } }; int main(){ int ia[6] = {0,1,2,3,4,5}; vector<int> iv(ia,ia+6); for_each(iv.begin().iv.end(),print<int>()); }
3.静态成员初始化问题
静态非const成员初始化,是在类定义内声明,类外定义时设定初值初始化;
静态const成员初始化,在类定义内直接初始化。
4.自增自减的前置与后置
C++中使用++和--,根据出现在对象的前面或者后面来进行调用。其实是根据函数重载来实现的,当编译器看到++a时,就调用operator++(a),当看到a++时,就调用operator(a,int)。这里编译器为int传递一个哑元常量值(因为此值永远也不会被使用),用来给后缀产生不同的标记。
使用示例如下,这是在类T中的代码:
//prefix: increment and then fetch T& operate++(){ ++(this->i);// 成员变量递增,不同T有不同表现 return *this; } //postfix: fetch and then increment const T operator++(int){ T temp = *this; ++(*this); return temp; }
5.stl中区间表示[ )
区间采用前闭后开的表示方法。[first,last),包含的元素范围为[first,last-1)。
6.仿函数
仿函数就是类似函数的结构体或者类。要把某类当做仿函数使用,类必须进行operator()重载,这是就可以像使用函数一样使用。
这里也加入第7章的内容,记录一下仿函数。
许多stl算法提供两个版本,一个用于一般状况,一个用于特殊状况。在特殊状况时,需要用户指定某个条件或者策略,而条件或者策略的背后由一整组操作构成。
在stl中,这一整组操作就是指的仿函数。一般的函数,如果当做参数传递,只有通过函数指针,但是指针无法只有自己的状态,更重要的一点是函数指针不能满足stl对抽象性的要求,所以达不到stl组件的可适配性。
仿函数根据函数参数可以分别为一元仿函数(unary_function)和二元仿函数(binary_function),用户自定义仿函数必须继承其中的一个。
下面是一元仿函数的参数型别和返回值类型,二元仿函数类似。
template <class Arg, class Result> struct unary_function{ typedef Arg argument_type; typedef Result result_type; }
根据功能分为算术类(Arithmetic)仿函数、关系运算类(Rational)仿函数和逻辑运算类(Logical)仿函数,这些仿函数也都继承自一元或者二元仿函数。
这里要清楚几个概念,
证同元素,所谓“运算op的证同元素”,即数值与某个元素做op运算,会得到自己,则该元素则为该运算符的证同元素。
证同函数,任何数值通过此函数后,都不会有任何改变。
选择函数,接受一个pair,传回第一个或者第二个值。
投射函数,传回一个参数,忽略另外一个。
相关文章推荐
- 《STL源码剖析》学习-- 1.9-- 可能令你困惑的C++语法1
- VS2013MFC对话框工程学习笔记九 - C++语法的的学习
- 对于SQL的Join,在学习起来可能是比较乱的。我们知道,SQL的Join语法有很多inner的,有outer的,有left的,有时候,对于Select出来的结果集是什么样子有点不是很清楚。Coding Horror上有一篇文章,通过文氏图 Venn diagrams 解释了SQL的Join。我觉得清楚易懂,转过来。 交差集" cross join 《Linux命令行与shell脚本编程大全
- c++语法学习--类的继承
- 第三讲:C++基础语法 & 创建第一个场景 ------学习笔记
- c++基本语法学习2 继承 多态 模板
- C++简单学习(Part1_lecture 1)(介绍、环境设置、基本语法、注释)
- 转:学习C++的50条忠告(希望有益于包括我在内的困惑的同学们...)
- C++ 高级语法学习与总结(代码实例)
- 刚才在论坛上看到的一些学习C++的东东,可能对初学有点用
- 学习笔记---C/C++语法
- c++模板类学习--例子编译可能有问题【注】
- C++ 高级语法学习与总结(代码实例)
- C++ 语法学习 2
- C++学习(一)——基本语法
- 你可能不知道的C++语法:文本操作符
- C++ 学习笔记 <1> C++ 语法基础知识
- C++学习笔记:异常的基本语法
- C++ 语法学习
- c++学习笔记(部分语法及c++11新特性)