当前位置: 首页 > wzjs >正文

长沙企业建站公司wordpress同步微信素材

长沙企业建站公司,wordpress同步微信素材,网站建立软件,深圳网站公司建设方案1、概论 编程范式:面向过程编程、面向对象编程、泛型编程。 泛型编程:目的是编写能够适合多种数据类型的代码,而不是为每种特定的数据类型编写重复的代码。 模板是实现泛型的主要工具,主要分为函数模板和类模板。 函数模板&am…

1、概论

编程范式:面向过程编程、面向对象编程、泛型编程。

泛型编程:目的是编写能够适合多种数据类型的代码,而不是为每种特定的数据类型编写重复的代码。

模板是实现泛型的主要工具,主要分为函数模板和类模板。

函数模板:

T代表了任意类型。

类模板:

ATL是泛型编程的典型应用。

2、函数模板

2.1 定义和调用

#include <iostream>
using namespace std;// 函数模板
/*
template<typename T>
函数的定义
*/int addInt(int a, int b) {int c = a + b;return c;
}double addDouble(double a, double b) {double c = a + b;return c;
}//提取“公因式”
template<typename T>//加之后 T就可用
T add(T a, T b) {T c = a + b;return c;
}int main() {int a = 1, b = 2;int c = addInt(a, b);cout << c << endl;//3double aa = 1.1, bb = 1.91;double cc = addDouble(aa, bb);cout << cc << endl;//3.01c = add(a, b);//自动类型的推导cout << c << endl;//3cc = add(aa, bb);cout << cc << endl;//3.01//显示指定类型c=add<int>(a, b);cout << c << endl;cc = add<double>(aa, bb);cout << cc << endl;//3.01int n = add<char>('a', 'b');cout<<n <<endl;//值为-61?return 0;
}

2.2 与普通函数的区别

#include <iostream>
using namespace std;int addInt(int a, int b) {int c = a + b;return c;
}double addDouble(double a, double b) {double c = a + b;return c;
}
//
template<typename T>
T add(T a, T b) {T c = a + b;return c;
}int main() {int a = 1, b = 2;double d = 2.1;double c = addDouble(a, b);//隐式类型转换,a/b转换为doublecout << c << endl;//int c = add(a, d);  错误: d是double 所以 T变成int又变成double 不可以//cout << c << endl;  //自动类型推导无隐式类型转换// 函数模板的  【显式指定类型】 调用时的 【隐式类型转换】int c1 = add<int>(a, d);c1 = add<double>(a, d);return 0;
}

2.3与普通函数的调用规则

#include <iostream>
using namespace std;int add(int a, int b) {cout << "调用普通函数" << endl;return a + b;
}template<typename T>
T add(T a, T b) {cout << "调用函数模板" << endl;return a + b;
}int main() {int a = 1, b = 2;add(a, b);//优先调用普通函数//输出:调用普通函数add<int>(a, b);//调用函数模板add<>(a, b);return 0;
}

函数模板的优先调用:

#include <iostream>
using namespace std;int add(int a, int b) {cout << "调用普通函数" << endl;int c = a + b;return c;
}template<typename T>
T add(T a, T b) {cout << "调用函数模板" << endl;T c = a + b;return c;
}int main() {double a = 1, b = 2;add(a, b);//普通函数未完美匹配,编译器选择函数模板return 0;
}

2.4 多参数函数被模板

#include <iostream>
using namespace std;//template<typename T1, typename T2, typename T3>
//T1 add(T2 a, T3 b) {
//    cout << typeid(T2).name() << endl;//返回值类型无法作为推导依据
//    cout << typeid(T3).name() << endl;
//    T1 c = a + b;
//    return c;
//}template<typename T2, typename T3>
T2 add(T2 a, T3 b) {cout << typeid(T2).name() << endl;//类型?  floatcout << typeid(T3).name() << endl;//__int64T2 c = a + b;return c;
}int main() {double r = add(4.0f, 8881281881);return 0;
}
/*
1、函数模板支持多个类型参数
2、一旦有类型不能推导,就会导致编译失败
3、返回值类型无法作为推导依据
*/

3、类模板

3.1 动态数组类

#include <iostream>
using namespace std;class DynamicArray {
private:int* elements;int size;
public:DynamicArray(int n) : size(n) {elements = new int[n];//动态内存申请}~DynamicArray() {delete[] elements;//会导致内存泄露,所以要销毁}int& operator[](int index) {  //[]的运算符重载return elements[index];  //返回引用,才可以赋值}
};int main() {int n = 10;// int a[n];错误int* p = new int[n];//实现DynamicArray da(100);da[1] = 3;//运算符重载da[9] = 4;cout << da[0] << ' ' << da[1] << endl;//-842150451 3return 0;
}

3.2 类模板的定义

#include <iostream>
using namespace std;//template<typename T>都可以
template<class T>
class DynamicArray {
private:T* elements;int size;
public:DynamicArray(int n) : size(n) {elements = new T[size];}~DynamicArray() {delete[] elements;}T& operator[](int index) {return elements[index];}
};int main() {//int n = 10;//int a[n];//int* p = new int[n];//实现类模板,代码的复用DynamicArray<double> da(100);//类模板实例化da[1] = 3.1;da[9] = 4.2;cout << da[0] << ' ' << da[9] << endl;//-6.27744e+66 4.2DynamicArray<char> dac(10);dac[0] = 'A';dac[1] = 'C';dac[2] = 'M';cout << dac[0] << dac[1] << dac[2] << endl;//ACMreturn 0;
}

3.3 成员函数

类内定义:

#include <iostream>
using namespace std;template<class T>
class DynamicArray {
private:T* elements;int size;
public:DynamicArray(int n) ; size(n) {elements = new T[n];}~DynamicArray() {delete[] elements;}T& operator[](int index) {  //return elements[index];}// 更新第 index 个索引的元素,把它的值改成 valuevoid update(int index, T value) {  //类模板的成员函数elements[index] = value;}
};int main() {DynamicArray<char> dac(100);dac[56] = 'h';dac.update(56, 'u');cout << dac[56] << endl;//ureturn 0;
}

类外定义:

#include <iostream>
using namespace std;template<class T>
class DynamicArray {
private:T* elements;int size;
public:DynamicArray(int n);~DynamicArray();T& operator[](int index);void update(int index, T value);// 更新第 index 个索引的元素,把它的值改成 value
};//类外定义成员函数
template<class T>//必加
DynamicArray<T>::DynamicArray(int n):size(n) {elements = new T[n];
}template<class T>//必加
DynamicArray<T>::~DynamicArray(){delete[] elements;
}template<class T>//必加
T& DynamicArray<T>::operator[](int index) {  //return elements[index];
}template<class T>//必加
void DynamicArray<T>::update(int index, T value) {  //类模板的成员函数elements[index] = value;
}int main() {DynamicArray<char> dac(100);dac[56] = 'h';dac.update(56, 'u');cout << dac[56] << endl;//ureturn 0;
}

创建时机:

#include <iostream>using namespace std;class Player {
public:void run() {cout << "跑步" << endl;}
};class Ball {
public:void drop() {cout << "下落" << endl;}
};template<class T>//类模板
class Test {T obj;
public:void move1() {//普通成员是在一开始就创建了,但类模板的obj.run();//成员函数会在调用时才创建}void move2() {obj.drop();}
};int main() {Test<Player> test1;test1.move1();//test1.move2()"drop": 不是 "Player" 的成员	类模板	Test<Ball> test2;// test2.move1();test2.move2();return 0;
}

3.4 类模板对象的函数传参

#include <iostream>
using namespace std;template<class NameType, class HpType>
class Hero {
public:Hero(NameType name, HpType hp) {this->m_name = name;this->m_hp = hp;}
private:NameType m_name;HpType m_hp;
};// 1、直接指定类型
void test1(Hero<string, double>& h) {}// 2、参数模板化
template<typename T1, typename T2>
void test2(Hero<T1, T2>& h) {}// 3、类模板化
template<typename T>
void test3(T& h) {}int main() {Hero<string, double> h("宋江", 100.0);test1(h);test2(h);test3(h);return 0;
} 

3.5继承

#include <iostream>
using namespace std;template<class NameType, class HpType>
class Hero {
public:Hero(NameType name, HpType hp) {this->m_name = name;this->m_hp = hp;}
private:NameType m_name;HpType m_hp;
};template<class T1, class T2, class T3>
class HeroSon : public Hero<T1, T2> {T3 a;
};int main() {return 0;
}


文章转载自:

http://ZhDVXsqD.Lpbrp.cn
http://EInlUW0A.Lpbrp.cn
http://weLZ3y2A.Lpbrp.cn
http://OKe0fwMD.Lpbrp.cn
http://QwhYFVqQ.Lpbrp.cn
http://h3TnGeV9.Lpbrp.cn
http://mhPmX4J2.Lpbrp.cn
http://bo9qymXw.Lpbrp.cn
http://MtywE99n.Lpbrp.cn
http://YXYIVuiA.Lpbrp.cn
http://vpq667Qc.Lpbrp.cn
http://OijObVjb.Lpbrp.cn
http://KgGOxXkb.Lpbrp.cn
http://lNlPmCLa.Lpbrp.cn
http://hWL5YnK1.Lpbrp.cn
http://P59kji6I.Lpbrp.cn
http://RAbcAnR7.Lpbrp.cn
http://mv2ZpD48.Lpbrp.cn
http://BpO1JK8m.Lpbrp.cn
http://Hm60kqwN.Lpbrp.cn
http://fxdQarWc.Lpbrp.cn
http://z3k3pY3V.Lpbrp.cn
http://kFTd87QZ.Lpbrp.cn
http://uCHK9iwH.Lpbrp.cn
http://qsCavOA2.Lpbrp.cn
http://Tw6F4YEC.Lpbrp.cn
http://KSpMGRNf.Lpbrp.cn
http://qnFJtO0R.Lpbrp.cn
http://rEBB2PnB.Lpbrp.cn
http://ZOK6vT05.Lpbrp.cn
http://www.dtcms.com/wzjs/758942.html

相关文章:

  • 网站建设公司与前端莱芜app下载
  • 专业做网站平台淘宝买模板注浆做网站
  • 浙江金圣建设有限公司网站如何学做网站
  • 南昌网站建设公司烟台品牌网站建设
  • 如何开发微网站网站建设数据的保密性
  • 合肥网站建设 合肥网络推广青岛网站建设订做
  • 端子网站建设ue4培训班一般学费多少
  • 防城港网站建设太原网站建站模板
  • 三明网站设计建网站要多少钱一台
  • 沂水网站开发深圳网站建设网页推广网站设计
  • h5动画网站旅游网站建设规划方案
  • 2023年最新科技新闻摘抄分站城市网站如何做seo
  • 常德网站建设字答科技jsp网站开发源码实例
  • 如何做后台管理员网站苏州有什么好玩的景点
  • 怎么安装网站代码wordpress企业网站开发
  • app开发导入网站模板建公司网站步骤
  • 国内投资咨询网站 html模板前端网站开发课程
  • 城市网站改版建设专业网站开发制作
  • 做网站app怎么赚钱吗网站备案信息被工信部删除
  • 青岛网站建设报价做led灯网站有哪些呢
  • strikingly建站怎么样给公司建网站需要多少钱
  • 购物网站后台管理模板网站费用属于哪个费用
  • 做网站 多少人wordpress主题文件夹在哪里设置
  • 洛阳建网站松江品划网站建设推广
  • dooor网站天心区网站建设公司
  • 十大高端网站设计文交所网站建设方案
  • 手机微网站开发教程wordpress插件汉化教程视频
  • 湘潭做网站品牌磐石网络网络规划设计师第二版pdf
  • 公司网站的推广河北建设工程信息网招标公告唐县水利局
  • 甘肃农产品网站建设微信建立免费网站吗