内联函数
内联函数与普通函数不同的是,内联函数直接将原函数拷贝到调用出,从而无须跳转,加快程序的运行速度
缺点是每一个调用处都需要有内联函数的拷贝,内存开销增大
在声明或定义前加上inline即可
inline void fn(a);
引用
引用在声明的时候必须要初始化,更像const指针,一旦与某个变量关联起来就不可改
(2) 可以有const指针,但是没有const引用;
(3) 指针可以有多级,但是引用只能是一级(int **p;合法 而 int &&a是不合法的)
(4) 指针的值可以为空,但是引用的值不能为NULL,并且引用在定义的时候必须初始化;
(5) 指针的值在初始化后可以改变,即指向其它的存储单元,而引用在进行初始化后就不会再改变了,从一而终。
(6)”sizeof引用”得到的是所指向的变量(对象)的大小,而”sizeof指针”得到的是指针本身的大小;
(7)指针和引用的自增(++)运算意义不一样;
模板函数
模板函数和非模板可以同型,选择的时候优先选择非模板函数
template <typename T>
T fn (T&e){ return e}
template <class T>
T fn (T & e){return e}
template<class T>
void fn(const T &t){
T::iteratir * a;
}
template<class T>
void fn(const T &t){
typename T::iteratir * a;
}
模板的隐式实例化与显示实例化,以及显示具体化
template <typename T>
void swap(T& a,T& b){
T temp=a;
a=b;
b=temp;
}
template void swap<int>(int a,int b);
swap<double>(a,b);
template<>
void swap(job& a,job& b){
int temp=a.num;
a.num=b.num;
b.num=temp;
}
decltype
根据括号内的表达式确定值
template<class T1,class T2>
void fn(T1 a,T2 b){
temp=a+b;
}
decltype(a+b) temp=a+b;
decltype(fn2()) temp=a+b;
decltype((a)) temp=a+b;
auto与decltype的区别
int a=8, b=3;
auto c=a+b;
decltype(a+b) d;
后置返回类型
//无法确定返回类型
template<class T1, class T2>
type? gt(T1 x,T2 y){
...
return x+y;
}
auto gt(T1 x,T2 y)->double{
...
return;
}
auto gt (T1 x,T2 y)->decltype(x+y){
...
return;
}