1.仿函數(shù)(functor)模仿函數(shù)的類
重載了()忍些,一般用于算法中需要傳入一個參數(shù)的函數(shù)對象眠寿。
比如count_if(iter.star(),iter.end(),A(5));
#include<iostream>
#include<vector>
#include<algorithm>
class A{
public:
A(const int first):m_aa(first){}
bool operator()(const int a){
return a>m_aa;
}
private:
int m_aa;
};
int main(){
A ca(10);
std::vector<int> v={1,5,2,34};
int sum = std::count_if(v.begin(),v.end(),ca);
std::cout<<sum<<std::endl;
}
2.std::function多態(tài)函數(shù)包裝器
std::function(類模板)是C++11新出來的,解決類成員函數(shù)是回調(diào)函數(shù)的問題,因?yàn)轭惡瘮?shù)自帶一個this指針。其實(shí)就可以理解成函數(shù)指針。
function可以綁定一般的普通函數(shù)踪蹬,也可以綁定模板函數(shù)胞此,模板類函數(shù),類成員函數(shù)等等跃捣。
std::bind是一個函數(shù)模板漱牵,它就像一個函數(shù)適配器,接受一個可調(diào)用對象(callable object)疚漆,生成一個新的可調(diào)用對象來“適應(yīng)”原對象的參數(shù)列表酣胀。一般而言,我們用它可以把一個原本接收N個參數(shù)的函數(shù)fn娶聘,通過綁定一些參數(shù)闻镶,返回一個接收M個(M可以大于N,但這么做沒什么意義)參數(shù)的新函數(shù)丸升。同時铆农,使用std::bind函數(shù)還可以實(shí)現(xiàn)參數(shù)順序調(diào)整等操作。
std::bind函數(shù)有兩種函數(shù)原型狡耻,定義如下:
template< class F, class... Args >
/*unspecified*/ bind( F&& f, Args&&... args );
template< class R, class F, class... Args >
/*unspecified*/ bind( F&& f, Args&&... args );
兩者使用方式如下:
#include<iostream>
#include<vector>
#include<algorithm>
#include<functional>
class A{
public:
A(const int first):m_aa(first){}
bool operator()(const int a){
return a>m_aa;
}
int divide(const int m,const int n){
return m/n;
}
private:
int m_aa;
};
int add(int a,int b){
return a+b;
}
int main(){
/*綁定普通函數(shù)*/
std::function<int(int,int)> func = add;
std::cout<<func(12,13)<<std::endl;
/*綁定lambda函數(shù)*/
func = [](int x,int y){return x+y;};
std::cout<<func(22,33)<<std::endl;
A a(1);
func = std::bind(&A::divide,a,std::placeholders::_1,std::placeholders::_2);
std::cout<<func(122,13)<<std::endl;
}
3.虛函數(shù)與純虛函數(shù)
C++的靜態(tài)綁定包括普通函數(shù)和模板類函數(shù)墩剖,在編譯期確定。
C++的動態(tài)綁定通過虛函數(shù)多態(tài)夷狰,在運(yùn)行期確定岭皂。
虛函數(shù)形式:
virtual void SetData(int a,int b);
純虛函數(shù)形式:
virtual void SetData(int a,int b) = 0;
說明:
1.如果基類中的某個函數(shù)是虛函數(shù),子類對應(yīng)繼承的函數(shù)不聲明virtual孵淘,也同樣是虛函數(shù)蒲障。
2.如果基類中有一個函數(shù)聲明為純虛函數(shù),則該類為虛基類瘫证,純虛函數(shù)都只有方法聲明,實(shí)現(xiàn)都必須在派生類去實(shí)現(xiàn)庄撮。
3.虛基類適合做公共接口背捌。讓所有子類去實(shí)現(xiàn)自己的接口方法。
#ifndef MYFATHERCLASS_H_
#define MYFATHERCLASS_H_
#include <iostream>
class MyFatherClass{
public:
virtual void setData(int a,int b) = 0;
virtual void printData() = 0;
};
class SonA:public MyFatherClass{
public:
void setData(int a,int b){m_a = a;m_b=b;};
void printData(){
std::cout<<"this is SonA PrintData"<<m_a+m_b<<std::endl;
}
private:
int m_a;
int m_b;
};
class SonB:public MyFatherClass{
public:
void setData(int a,int b){m_a = a;m_b=b;};
void printData(){
std::cout<<"this is SonB PrintData:"<<m_a+m_b<<std::endl;
}
private:
int m_a;
int m_b;
};
#endif /* MYFATHERCLASS_H_ */
測試主函數(shù)
#include "MyFatherClass.h"
int main(){
MyFatherClass *p = new SonA();
p->setData(33,15);
p->printData();
p = new SonB();
p->setData(23,45);
p->printData();
return 0;
}
運(yùn)行結(jié)果:
this is SonA PrintData48
this is SonB PrintData:68