模板函数的小小的案例
环境:vscode
T_Case.h
// 需求:定义一个模板函数,实现对一个数组中对元素进行升序排序
#include <iostream>
using namespace std;
template <typename T>
void mySort(T array[], int len)
{
for (int index = 0; index < len - 1; index++)
{
int minIndex = index;
for (int k = index + 1; k < len; k++)
{
if (array[minIndex] > array[k])
{
minIndex = k;
}
}
if (minIndex != index)
{
T temp = array[index];
array[index] = array[minIndex];
array[minIndex] = temp;
}
}
}
// 需求:定义一个模板函数,实现将一个数组中对元素拼接成为字符串返回
template <class T>
void showArray(T array[], int len)
{
if (len == 0)
{
cout << "[]" << endl;
return;
}
cout << "[";
for (int i = 0; i < len - 1; i++)
{
cout << array[i] << ", ";
}
cout << array[len - 1] << "]" << endl;
}
T_Case.cpp
#include <iostream>
#include "T_case.h"
int main()
{
// 定义一个int[]
int array1[] = {1, 3, 5, 7, 9, 0, 8, 6, 4, 2};
int len1 = sizeof(array1) / sizeof(int);
mySort(array1, len1);
showArray(array1, len1);
// 定义一个double[]
double array2[] = {3.14, 9.28, 3, 3.44, -9.2, 8.22};
int len2 = sizeof(array2) / sizeof(double);
mySort(array2, len2);
showArray(array2, len2);
// 定义一个char[]
char array3[] = {'a', 'l', '1', 'm', 'k'};
int len3 = sizeof(array3) / sizeof(char);
mySort(array3, len3);
showArray(array3, len3);
return 0;
}
类模板的继承
#include <iostream>
using namespace std;
//模版类中的虚拟类型是不能继承的
template <typename T>
class Animal{
public:
T arg;
};
//普通类继承类模板,需指定父类中的虚拟类型
class Dog:public Animal<int>{
};
//类模板继承类模板
template <typename E>
class Cat:public Animal<E>{
};
int main(){
Dog xiaobai;
xiaobai.arg=10;
Cat<string>xiaohei;
xiaohei.arg="abc";
return 0;
}
类模板中的成员函数创建时机
class Dog {
public:
void bark() { cout << "汪汪" << endl; }
}
class Cat {
public:
void sleep() { cout << "呼呼" << endl; }
}
template<typename T>
class Person {
public:
T pet;
void makeBark() {
pet.bark();
}
void makeSleep() {
pet.sleep();
}
}
int main() {
// 在类设计完成后,直接编译程序,发现是没有问题的。
// 调用makeBark函数的时候,也是没有问题的,可以正常调用。
Person<Dog> xiaobai;
xiaobai.makeBark();
// 调用makeSleep函数的时候就出问题了,不能调用了!
xiaobai.makeSleep();
// 原因:类模板中的成员函数是在调用的时候才会创建的!
// 因为在编译的时候,只是知道有一个对象是Pet,但是具体是什么类型,不知道!
// 在调用makeBark的时候,创建了这个函数,而我们设置的类型是Dog类型,没有问题,可以正常执行
// 在调用makeSleep的时候,创建了这个函数,判断pet的类型是Dog类型,而在Dog类中不存在sleep函数,因此就报错了。
return 0;
}
类模板类外实现
在C++中,当类模板的成员函数在类外实现时,需要指定模板类的类型。这是因为在类模板定义之后,编译器无法确定类模板的具体实例化类型,所以在类外实现成员函数时需要明确告诉编译器这个成员函数是属于哪个类模板实例的。
template<typename T, typename M>
class NumberCalculator {
private:
T n1;
M n2;
public:
NumberCalculator() {}
NumberCalculator(T n1, M n2);
void add();
};
// 构造函数类外实现
template<typename T, typename M>
NumberCalculator<T, M>::NumberCalculator(T n1, M n2) {
this->n1 = n1;
this->n2 = n2;
}
// 普通函数类外实现
template<typename T, typename M>
NumberCalculator<T, M>::add() {
cout << n1 + n2 << endl;
}
类模板遇到友元
// 全局友元函数类外实现-03:定义类
template<typename T, typename M>
class NumberCalculator;
// 全局友元函数类外实现-02:在类之前定义
template<typename T, typename M>
void printNumberCalculator(const NumberCalculator<T, M>& op) {
cout << "n1 = " << op.n1 << ", n2 = " << op.n2 << endl;
}
template<typename T, typename M>
class NumberCalculator {
// 全局友元函数类内实现,无需进行什么处理,直接在这里写实现即可。
/*
friend void printNumberCalculator(const NumberCalculator<T, M>& op) {
cout << "n1 = " << op.n1 << ", n2 = " << op.n2 << endl;
}
*/
// 全局友元函数类外实现—01:在函数的后面添加一对尖括号,表示一个模板函数
friend void printNumberCalculator<>(const NumberCalculator<T, M>& op);
private:
T n1;
M n2;
public:
NumberCalculator();
NumberCalculator(T n1, M n2);
};
template<typename T, typename M>
NumberCalculator<T, M>::NumberCalculator(T n1, M n2) {
this->n1 = n1;
this->n2 = n2;
}
template<typename T, typename M>
NumberCalculator<T, M>::NumberCalculator() = default;
int main() {
NumberCalculator<int, int> op(10, 20);
printNumberCalculator(op);
return 0;
}
标签:函数,int,template,n1,NumberCalculator,模板
From: https://blog.csdn.net/yangguanghhh/article/details/136812727