第一个要描述的是临时对象,也就是无名对象。刻意制造临时对象的方法就是在类别名称之后加上(),并且可以指定初值
如int(8)等
下面是具体代码
#include<vector>
#include<algorithm>
#include<iostream>
using namespace std;
template <typename T>
class print{
public :
void operator()(const T& elem){//重载operator()
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>());
//print()作为一个临时变量被传入for_each for_each结束时 这个临时对象也就结束了它的声明
}
由c++的知识我们知道静态变量需要在类的外面初始化,但是这里静态常量的整数成员函数可以直接在class内部初始化,所谓的integral指的是所有的整数类别 不单只是int
#include<iostream>
using namespace std;
template<typename T>
class testClass{
public:
static const int _datai=5;
static const long _datal=3L;
static const char _datac='c';
};
int main(){
cout<<testClass<int>::_datai<<endl;
cout<<testClass<int>::_datac<<endl;
cout<<testClass<int>::_datal<<endl;
}
increment/decement/dereference操作符的实现
#include<iostream>
using namespace std;
class INT{
friend ostream& operator<<(ostream& os,const INT&i);
public:
INT(int i):m_i(i){};
//前向叠加
INT & operator++(){
++(this->m_i);
return *this;
}
//后向叠加
const INT operator++(int)
{
INT temp=*this;
++(*this);
return temp;
}
//前项递减
INT &operator --(){
--(this->m_i);
return *this;
}
//后向递减
const INT operator --(int){
INT temp =*this;
--(*this);
return temp;
}
//引用
int & operator *()const{//类型转换 转换成int类型的引用
return (int &)m_i;
}
private:
int m_i;
};
ostream & operator<<(ostream & os,const INT&i){
os<<'['<<i.m_i<<']';
return os;
}
int main(){
INT I(5);
cout<<I++;
cout<<++I;
cout<<I--;
cout<<--I;
cout<<*I<<endl;//此时已经发生了类型转换 没有使用重载的<< 所以在输出的时候没有[]
cout<<15<<endl;
}
这里需要注意的是:运行47行的运行结果没有中括号【】,具体原因在代码中已经说明了
前闭后开区间表示法
[first,last)
整个实际范围是从first开始的,直到last-1,迭代器last指的是“最后一个元素的下一个元素”
function call 操作符 (operator())
#include<cstdlib>
#include<iostream>
using namespace std;
int fcmp(const void*elem1,const void *elem2);
int main(){
int ia[10]={32,92,67,58,10,4,25,52,59,54};
for(int i=0;i<10;i++)
cout<<ia[i]<<" ";
qsort(ia,sizeof(ia)/sizeof(int),sizeof(int),fcmp);
for(int i=0;i<10;i++)
cout<<ia[i]<<" ";
return 0;
}
int fcmp(const void* elem1,const void*elem2){
const int*i1=(const int *)elem1;
const int*i2=(const int *)elem2;
if(*i1<*i2)
return -1;
else if(*i1==*i2)
return 0;
else if(*i1>*i2)
return 1;
}
/*
void qsort(
void *base,
size_t nmemb,
size_t size,
int (*compar)(const void *, const void *)
);
函数功能:qsort()函数的功能是对数组进行排序,数组有nmemb个元素,每个元素大小为size。
参数base - base指向数组的起始地址,通常该位置传入的是一个数组名
参数nmemb - nmemb表示该数组的元素个数
参数size - size表示该数组中每个元素的大小(字节数)
参数(*compar)(const void *, const void *) - 此为指向比较函数的函数指针,决定了排序的顺序。
*/
仿函数 operator()重载的例子
#include<iostream>
using namespace std;
template<class T>
struct plus1{
T operator()(const T&x,const T&y)const {return x+y;}
};
template <class T>
struct minus1{
//由于将operator()重载了 因此plus成立一个仿函数
T operator()(const T&x,const T&y)const {return x-y;}
};
int main(){
plus1<int>plusobj;
minus1<int>minusobj;
//一下使用仿函数 就像使用一般函数一样
cout<<plusobj(3,5)<<endl;
cout<<minusobj(3,5)<<endl;
//直接产生仿函数的临时对象
cout<<plus1<int>()(43,50)<<endl;
cout<<minus1<int>()(43,50)<<endl;
return 0;
}