哪个网站用div做的好,沉默是金女声翻唱,什么是wordpress后台,联盟营销网站有哪些1.模板
#xff08;1#xff09;简介
/** C提高编程* 本阶段主要针对C泛型编程 和 STL技术 做详细讲解#xff0c;探讨C更深层的使用** 1.模板* 概念#xff1a;模板就是建立通用的模具#xff0c;大大提高复用性** 特点#xff1a;* 模板不可以直接使用#xff…1.模板
1简介
/** C提高编程* 本阶段主要针对C泛型编程 和 STL技术 做详细讲解探讨C更深层的使用** 1.模板* 概念模板就是建立通用的模具大大提高复用性** 特点* 模板不可以直接使用它只是一个框架* 模板的通用并不是万能的*/
int main() {return 0;
}2函数模板
/** 函数模板* 建立一个通用函数其函数返回值类型和形参类型可以不具体指定用一个虚拟的类型来代表。* 语法templatetypename T* 函数声明或者定义* 解释template--声明创建模板* tempname --表明其后面的符号是一种数据类型可用class替换* T --通用的数据类型名称可以替换通常为大写字母** 隐式模板 mySwap(a,b);* 显示模板 mySwapint(a,b);** 注意事项* 自动类型推导需要推导出一致的数据类型T才可以使用* 模板必须要确定出T的数据类型才可以使用。*/
//函数模板
templatetypename T //声明一个模板告诉编译器后面代码中紧跟着的T不要报错T是一个通用数据类型
void mySwap(T a,T b){T tempa;ab;btemp;
}
templatetypename T
void func(){coutfun 调用endl;
}
void test01(){int a10;int b20;//1.自动类型推导mySwap(a,b);//2.显示指定类型mySwapint(a,b);coutaaendl;coutbbendl;
}
int main() {test01();funcint();return 0;
}
3函数模板案例
/** 函数模板案例** 描述* 利用函数模板封装一个排序的函数可以对不同数据类型素组进行排序* 排序规则从大到小排序算法为选择排序* 分别利用char数组和int数组进行测试**/templateclass T
void mySort(T arr[],int len){for(int i0;ilen;i){int maxi; //认定最大值得小标for(int ji1;jlen;j){//认定的最大值比遍历出的数组要小说明j下表的数值大if(arr[max]arr[j]){maxj;}}if(max!i){T temparr[max];arr[max]arr[i];arr[i]temp;}}
}//冒泡排序
templatetypename T
void sayArray(T arr[],int len) {cout 数组元素为: sizeof(arr) endl;for (int i 0; i len; i) {cout arr[i] endl;}
}void test01() {char charArr[]abcdef;int numsizeof (charArr)/ sizeof(char);mySort(charArr,num);sayArray(charArr,num);
}int main() {test01();return 0;
}
4普通模板和函数模板的调用规则
/** 普通函数和函数模板的调用规则* 如果函数模板和普通函数都可以实现优先调用普通函数* 可以通过空模板参数列表来强制调用函数模板 myPrint(2,2);* 函数模板也可以发生重载* 如果函数模板可以产生更好的匹配优先调用函数模板*/void myPrint(int a, int b) {cout 调用的普通函数 endl;
}templatetypename T
void myPrint(T a, T b) {cout 调用的模板 endl;
}//函数模板 重载
templatetypename T
void myPrint(T a, T b, int) {cout 调用的模板 endl;
}int main() {myPrint(1, 2);//空模板参数列表强制调用函模板myPrint(2, 2);//如果函数模板产生更好的匹配优先调用函数模板myPrint(1, a);return 0;
}
5模板的局限性
/** 模板的局限性* 模板的通用性并不是万能的* 有些特定数据类型需要用具体化方式做特殊实现*/class Person {
public:string name;int age;Person(string name, int age) {this-name name;this-age age;}bool operator(Person p) {coutoperator 函数被调用了endl;if (this-name p.name this-age p.age) {return true;} else {return false;}}
};//对比两个数据是否相等
templateclass T
bool myCompare(T a, T b) {if (a b) {return true;} else {return false;}
}void test01() {int a 20;int b 20;bool ret myCompare(a, b);if (ret) {cout ab endl;} else {cout a!b endl;}
}void test02() {Person p1(张三, 10);Person p2(李四, 10);bool ret myCompare(p1, p2);cout p1p2: ret endl;
}int main() {test01();test02();return 0;
}7类模板
1类模板开胃菜
/** 类模板* 类模板语法* 建立一个通用类类中的成员 数据类型可以不具体定制用一个虚拟的类型来代表。** 语法* templatetypename T* 类* 解释* template -- 声明创建模板* typename -- 表明其后面的符号是一种数据类型可以用class代替* T -- 通用的数据类型名称可以替换通常为大写字母**///类模板
templateclass nameType, class ageType
class Person {
public:nameType name;ageType age;Person(nameType name, ageType age) {this-name name;this-age age;}void showPerson() {cout name this-name ;age age endl;}
};void test01() {Personstring, int p1(孙大圣, 28);p1.showPerson();Person p2(孙大圣2, 282);p2.showPerson();
}int main() {test01();return 0;
}2类模板与函数模板的区别
/** 类模板和函数模板区别* 1.类模板没有自动类型推导的使用 自己使用的版本为C20,以支持自动推导* 。类模板在模板参数列表中可以有默认参数**///类模板与函数模板的区别
templateclass nameType, class ageTypestring
class Person {
public:nameType name;ageType age;Person(nameType name, ageType age) {this-name name;this-age age;}void showPerson() {cout name this-name ;age age endl;}
};//1.类模板没有自动类型推导使用方式
void test01() {Person p1(孙悟空, 1000);
}//2.类模板在模板参数列表中可以有默认参数
void test02() {Person p2(aaa, 123);p2.showPerson();Person p3(bbb, 234);p3.showPerson();
}int main() {test02();return 0;
}3类模板中成员函数创建时机
/** 类模板中成员函数创建时机** 类模板中成员函数和普通类中成员函数创建时机是有区别的* 普通泪中的成员函数一开始就可以创建* 类模板中的成员函数在调用时候才创建**/class Person1 {
public:void showPerson1() {cout Person1 endl;}
};class Person2 {
public:void showPerson2() {cout Person2 show endl;}
};templateclass T
class myClass {
public:T obj;//类模板中的成员函数void func1() {obj.showPerson1();}void func2() {obj.showPerson2();}
};void test01() {myClassPerson1 m;m.func1();//m.func2(); //报错提示没有这个方法myClassPerson2 m2;m2.func2();
}int main() {test01();return 0;
}
4类模板对象做函数参数
** 类模板对象做函数参数** 学习目标类模板实例化出的对象向函数传参的方式** 三种方式* 1.指定传入的类型直接显示对象的数据类型* 2.参数模板化:将对象中的参数变为模板进行传递* 3.整个类模板化将这个对象类型 模板化进行传递**/templateclass T1, class T2
class Person {
public:T1 name;T2 age;Person(T1 name, T2 age) {this-name name;this-age age;}void showPerson() {cout name name ;age age endl;}
};//1.指定传入类型
void printPerson1(Personstring, int p) {p.showPerson();
}void test01() {Personstring, int p(孙悟空, 100);printPerson1(p);
}templateclass T1, class T2
void printPerson2(PersonT1, T2 p) {p.showPerson();cout T1类型为: typeid(T1).name() endl;cout T2类型为: typeid(T1).name() endl;
}//2.参数模板花
void test02() {Personstring, int p(猪八戒, 90);printPerson2(p);
}templateclass T
void printPerson3(T p) {p.showPerson();
}//3.整个类模板化
void test03() {Personstring, int p(唐山, 20);printPerson3(p);
}int main() {cout test01() endl;test01();cout test02() endl;test02();cout test03() endl;test03();return 0;
}5类模板与继承
/** 类模板与继承** 当类模板碰到继承时需要注意* 当子类继承的父类是一个类模板时子类在声明的时候要指定出父类中的T的类型* 如果不指定编译器无法给子类分配内存* 如果想灵活指定出父类中T的类型子类也需要变为类模板**///类模板与继承
templateclass T
class Base {T m;
};//class Son:public Base{ //错误必须要知道父类中的T类型才能继承给子类
//
//};class Son : public Baseint {};void test01() {Son son;
}//如果想灵活指定父类中T类型子类也需要变类模板
templateclass T1, class T2
class Son2 : public BaseT2 {
public:T1 obj;Son2() {cout T1类型为: typeid(T1).name() endl;cout T2类型为: typeid(T2).name() endl;}
};void test02() {Son2int, char s2;
}int main() {test01();test02();return 0;
}6类模板成员函数类外实现
/** 类模板成员函数类外实现* 学习目标能够掌握类模板中的成员函数类外实现*/templateclass T1,class T2
class Person{
public:T1 name;T2 age;Person(T1 name,T2 age);void showPerson();
};//类模板 成员函数类外实现
templateclass T1,class T2
PersonT1,T2::Person(T1 name,T2 age){this-namename;this-ageage;
}
//成员函数的类外实现
templateclass T1,class T2
void PersonT1,T2::showPerson(){cout姓名:name;年龄ageendl;
}void test01(){Personstring,int p(AAA,18);p.showPerson();Person p2(AAA,18);p2.showPerson();
}int main() {test01();return 0;
}
7类模板与友元
/** 类模板与友元** 学习目标* 掌握类模板配合友元函数的类内和类外实现* 全局函数类内实现 -- 直接在类内声明友元即可* 全局函数类外实现 -- 需要提前让编译器知道全局函数的存在*///让编译器提前知道Person类的存在
templateclass T1, class T2
class Person;//类外实现
//加空模板参数列表
//如果全局函数 是类外实现需要让编译器提前知道这个函数的存在
templateclass T1, class T2
void printPerson2(PersonT1, T2 p) {cout 类外实现姓名: p.name ;年龄: p.age endl;
}//通过全局函数打印Perosn信息
templateclass T1, class T2
class Person {//全局函数 类内实现friend void printPerson(PersonT1, T2 p) {cout 姓名: p.name ;年龄: p.age endl;}//全局函数 类外实现friend void printPerson2();public:T1 name;T2 age;Person(T1 name, T2 age) {this-name name;this-age age;}
};//1.全局函数类内实现
void test01() {Person p1(Tom, 18);printPerson(p1);
}//1.全局函数类外实现
void test02() {Person p2(Dog, 22);printPerson(p2);
}int main() {test01();test02();return 0;
}
8类模板案例
未学习
https://www.bilibili.com/video/BV1et411b73Z?p183