房地产网站设计方案,建设网站开发,青岛网上房地产网签查询,怎么来维护已经上传的网站呢目录
1. 泛型编程
2. 函数模板
2.1 函数模板的概念及格式 2.2 函数模板的原理 2.3 模板的实例化
2.4 模板参数的匹配原则 3. 类模板
3.1 类模板格式
3.2 类模板的实例化 1. 泛型编程 什么是泛型编程#xff1f;泛型编程是避免使用某种具体类型而去使用某种通用类型来进行…目录
1. 泛型编程
2. 函数模板
2.1 函数模板的概念及格式 2.2 函数模板的原理 2.3 模板的实例化
2.4 模板参数的匹配原则 3. 类模板
3.1 类模板格式
3.2 类模板的实例化 1. 泛型编程 什么是泛型编程泛型编程是避免使用某种具体类型而去使用某种通用类型来进行程序编写的方式依次来复用某段代码而避免大规模功能相似重复冗余的代码。下面的代码如果想用泛型编程该如何实现。
int add(int a,int b)
{return a b;
}
double add(double a, int b)
{return a b;
}
double add(int a, double b)
{return a b;
} 马云有次说了这么一句话“世界是懒人创造的懒不是傻懒如果你想少干就要想出懒的方法。 要懒出风格懒出境界。”C必然也是有风格有境界的所以C中设计了模板实现了泛型编程。
2. 函数模板
2.1 函数模板的概念及格式 模板就是一种模具通过给这个模具中放不同的材料类型来获得不同材料的产品以此来提高我们的工作效率。而函数模板就是某个函数的模具与类型无关在使用的时候参数化在我们给出特定类型就会生成特定类型的版本。 函数模板的格式 templatetypename T1, typename T2 ...typename Tn 返回值类型 函数名(形参列表) { //函数体 } 根据这个函数的模板我们就可以实现上述add函数的模板
templatetypename L, typename R,typename RET
RET add(L l, R r)
{return l r;
}
注typename是用来定义模板参数的关键字也可以用class代替。 2.2 函数模板的原理 函数模板本身不是函数而是一个模具当我们传入实际类型的时候编译器会根据我们传入的实参类型来推演生成对应类型的函数进行调用。 2.3 模板的实例化 当我们将类型传入模板来生产函数的时候称之为模板的实例化模板的实例化分为隐式实例化和显式实例化。 1. 隐式实例化隐式实例化就是我们不去指定类型让编译根据我们传入的实参判断其类型传入模板参数列表进行实例化。如下
templatetypename L, typename R
int add(L l, R r)
{return l r;
}
int main()
{int a 0, b 1;cout add(a, b) endl; //根据我传入的a和b自动判断类型进行模板实例化。
} 细心的同学发现这里我将原来的代码中 typename RET 删掉了原因就是模板不会对函数的返回值类型进行自动判断而需要我们手动指定也就是显式实例化。 2. 显式实例化显式实例化就是我们手动向模板传递类型然后由编译器进行实例化。显式实例化的格式为 函数名类型1类型2...实参列表 如
templatetypename L, typename R, typename RET
RET add(L l, R r)
{return l r;
}
int main()
{int a 0, b 1;cout addint,int,int(a, b) endl;
} 上述代码我们传进去的 a和b的类型与模板参数类型是匹配的如果不匹配的话编译器会进行隐式类型转化如果转化失败就报错。如下 类型转换成功
templatetypename L, typename R, typename RET
RET add(L l, R r)
{return l r;
}
int main()
{double a 0.1;int b 1;cout addint,int,int(a, b) endl; //adouble类型隐式转换成int类型
} 输出 类型转化失败
templatetypename L, typename R, typename RET
RET add(L l, R r)
{return l r;
}class Date
{//
};
int main()
{int a 0, b 1;cout addint,Date,int(a, b) endl; //a类型转化失败
} 输出 E0304 没有与参数列表匹配的 函数模板 add 实例 2.4 模板参数的匹配原则 一个函数的模板函数可以与非模板函数同时存在并且在没有显式实例化且类型匹配的情况下会优先匹配非模板函数如果是显式实例化才会调用模板如下。
templateclass T
void swap(T a, T b)
{std::swap(a, b);std::cout 我是模板 ;std::cout a b std::endl;}
void swap(int a, int b)
{std::swap(a, b);std::cout 我是非模板 ;std::cout a b std::endl;}
int main()
{int a 1, b 2;std::cout a b std::endl;swap(a, b); //类型匹配优先调用非模板函数swapint(a, b); //调用模板实例化
} 输出 当我们没有去写模板的时候函数发生类型不匹配可能会进行隐式类型转换但是有了模板之后就不会发生隐式类型转化而是使用模板实例化出来一个更为合适的函数。如下 没有模板时会发生隐式实例化
void test(int a, int b)
{std::cout 我不是模板 std::endl;
}int main()
{test(2, 2.0);//2.0发生隐式类型转化成int
} 输出 存在模板不会发生隐式类型转化而是使用模板实例化出来一个更为合适的函数
templateclass T1,class T2
void test(T1 a, T2 b)
{std::cout 我是模板 std::endl;
}
void test(int a, int b)
{std::cout 我不是模板 std::endl;
}
int main()
{test(2, 2.0);//不发生隐式类型转化而是隐式实例化模板
} 输出 3. 类模板
3.1 类模板格式 和函数模板一样类模板是类的一个模具类模板格式如下 templateclass T1,class T2,class T3,...class Tn class 类模板名 { //类体 }; 我们普通类是可以声明和定义分离的如果类模板要实现声明和定义分离那么在定义的时候也要加上模板声明。如
templateclass T1, class T2
class A
{~A(); //声明
};templateclass T1,class T2
AT1, T2::~A() //定义
{//...
}
3.2 类模板的实例化 类模板的实例化和函数模板相同需要在类名后加上尖括号并且指定类型。注模板名不是类实例化后才是一个类。
templateclass T
class Date
{//..
};
int main()
{Dateint;
}