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

客户说做网站没效果梁水才seo优化专家

客户说做网站没效果,梁水才seo优化专家,网站网页设计的公司,网站建设客户开发方案目录 1. 模板概念 2. 函数模板语法 3. 函数模板注意事项 4. 函数模板案例 5. 普通函数与函数模板的区别 6. 普通函数与函数模板的调用规则 7. 模板的局限性 1. 模板概念 在C中,模板是一种通用的程序设计工具,它允许我们处理多种数据类型而不是固…

目录

1. 模板概念

2. 函数模板语法

3. 函数模板注意事项

4. 函数模板案例

5. 普通函数与函数模板的区别

6. 普通函数与函数模板的调用规则

7. 模板的局限性


1. 模板概念

在C++中,模板是一种通用的程序设计工具,它允许我们处理多种数据类型而不是固定的一种。函数模板就是其中之一,它使得我们可以编写一个函数来处理不同类型的数据。

模板的特点:

  • 模板不可以直接使用,它只是一个框架,必须确定出T的类型(第3章有讲)

  • 模板的通用并不是万能的

2. 函数模板语法

C++提供两种模板机制:函数模板类模板 。为避免文章冗长,本文先介绍函数模板,下一篇文章介绍类模板。

函数模板作用:
建立一个通用函数,其函数返回值类型形参类型可以不具体制定,用一个虚拟的类型来代表。

使用语法:

template<typename T> 或者 template<class T>

template<typename T>表示声明一个模板,typename T是模板参数,
typename —— 表面其后面的符号是一种数据类型,可以用class代替。
个人习惯用template<typename T>代表函数模板,template<class T>代表类模板。
T —— 通用的数据类型,名称可以替换,通常为大写字母T。

示例:

//交换整型函数
void swapInt(int& a, int& b) {int temp = a;a = b;b = temp;
}//交换浮点型函数
void swapDouble(double& a, double& b) {double temp = a;a = b;b = temp;
}//利用模板提供通用的交换函数
template<typename T>
void mySwap(T& a, T& b)
{T temp = a;a = b;b = temp;
}void test01()
{int a = 10;int b = 20;//swapInt(a, b);//利用模板实现交换//1、自动类型推导mySwap(a, b);//2、显示指定类型mySwap<int>(a, b);cout << "a = " << a << endl;cout << "b = " << b << endl;}int main() {test01();system("pause");return 0;
}
  • 函数模板利用关键字 template

  • 使用函数模板有两种方式:1、自动类型推导    2、显示指定类型

  • 模板的目的是为了提高复用性,将类型参数化

3. 函数模板注意事项

  • 自动类型推导的限制:当使用自动类型推导时,编译器需要根据函数参数类型推导出一致的数据类型 T 才能成功实例化模板函数。如果无法推导出一致的类型,将导致编译错误。
    // 示例代码
    template<typename T>
    void myFunction(T arg1, T arg2) {// 函数体
    }int main() {myFunction(10, 20);  // 正确:推导出一致的 int 类型myFunction(10, 20.5);  // 错误:无法推导出一致的类型return 0;
    }
    
  • 模板参数的确定:在模板函数调用时,必须要确定模板参数的数据类型,否则编译器无法生成对应的函数实例。
    // 2、模板必须要确定出T的数据类型,才可以使用
    template<class T>
    void func()
    {cout << "func 调用" << endl;
    }void test01()
    {//func(); //错误,模板不能独立使用,必须确定出T的类型func<int>(); //利用显示指定类型的方式,给T一个类型,才可以使用该模板
    }
    

fun<int>()代表对模板函数 fun 进行实例化,并指定模板参数 T 的具体类型为 int。在这种情况下,编译器会生成一个针对 T 为 int 类型的具体函数实现。其效果就好比是将模板中的 T 替换为 int,然后使用 int 类型的函数来处理相应的逻辑

4. 函数模板案例

案例描述:

  • 利用函数模板封装一个排序的函数,可以对不同数据类型数组进行排序

  • 排序规则从大到小,排序算法为选择排序

  • 分别利用char数组int数组进行测试

//交换的函数模板
template<typename T>
void mySwap(T &a, T&b)
{T temp = a;a = b;b = temp;
}template<typename T> // 也可以替换成class
//利用选择排序,进行对数组从大到小的排序
void mySort(T arr[], int len)
{for (int i = 0; i < len; i++){int max = i; //最大数的下标for (int j = i + 1; j < len; j++){if (arr[max] < arr[j]){max = j;}}if (max != i) //如果最大数的下标不是i,交换两者{mySwap(arr[max], arr[i]);}}
}
template<typename T>
void printArray(T arr[], int len) {for (int i = 0; i < len; i++) {cout << arr[i] << " ";}cout << endl;
}
void test01()
{//测试char数组char charArr[] = "bdcfeagh";int num = sizeof(charArr) / sizeof(char);mySort(charArr, num);printArray(charArr, num);
}void test02()
{//测试int数组int intArr[] = { 7, 5, 8, 1, 3, 9, 2, 4, 6 };int num = sizeof(intArr) / sizeof(int);mySort(intArr, num);printArray(intArr, num);
}int main() {test01();test02();system("pause");return 0;
}

5. 普通函数与函数模板的区别

普通函数与函数模板区别:

  • 普通函数调用时可以发生自动类型转换隐式类型转换

  • 函数模板调用时,如果利用自动类型推导不会发生隐式类型转换

  • 如果利用显示指定类型的方式,可以发生隐式类型转换

示例:

// 普通函数和函数模板的区别// 1、普通函数调用可以发生隐式类型转换
// 2、函数模板用 自动类型推导时,不可以发生隐式类型转换
// 3、函数模板用 显示指定类型时,  可以发生隐式类型转换// 普通函数
int myAdd01(int a, int b)
{return a + b;
}// 模板函数
template<typename T>
T myAdd02(T a, T b)
{return a + b;
}void test01()
{int a = 10;int b = 20;char c = 'c';cout << "普通函数:int a + int b = " << myAdd01(a, b) << endl;// 普通函数中,隐式的将c转成了ASSIC码,c-99cout << "普通函数:int a + char c = " << myAdd01(a, c) << endl;// 自动类型推导// 会报错,模板函数自动类型推导时,不会发生隐式类型转换// cout << "模板函数:int a + char c = " << myAdd02(a, c) << endl;// 显示指定类型cout << "模板函数:int a + char c = " << myAdd02<int>(a, c) << endl;
}int main()
{test01();
}

6. 普通函数与函数模板的调用规则

调用规则如下:

  1. 如果函数模板和普通函数都可以实现,优先调用普通函数

  2. 可以通过空模板参数列表来强制调用函数模板

  3. 函数模板也可以发生重载

  4. 如果函数模板可以产生更好的匹配,优先调用函数模板

//普通函数与函数模板调用规则
void myPrint(int a, int b)
{cout << "调用的普通函数" << endl;
}template<typename T>
void myPrint(T a, T b) 
{ cout << "调用的模板" << endl;
}template<typename T>
void myPrint(T a, T b, T c) 
{ cout << "调用重载的模板" << endl; 
}void test01()
{//1、如果函数模板和普通函数都可以实现,优先调用普通函数// 注意 如果告诉编译器  普通函数是有的,但只是声明没有实现,或者不在当前文件内实现,就会报错找不到int a = 10;int b = 20;myPrint(a, b); //调用普通函数//2、可以通过空模板参数列表来强制调用函数模板myPrint<>(a, b); //调用函数模板//3、函数模板也可以发生重载int c = 30;myPrint(a, b, c); //调用重载的函数模板//4、 如果函数模板可以产生更好的匹配,优先调用函数模板char c1 = 'a';char c2 = 'b';myPrint(c1, c2); //调用函数模板
}int main() 
{test01();system("pause");return 0;
}

既然提供了函数模板,最好就不要提供普通函数,否则容易出现二义性。

7. 模板的局限性

例如:

template<class T>void f(T a, T b){ a = b;}

如果数据类型是int型,此时的赋值操作没问题。如果传入的a和b是一个数组,就无法实现了。

再例如:

template<class T>void f(T a, T b){ if(a > b) { ... }}

如果T的数据类型传入的是像Person这样的自定义数据类型,也无法正常运行。

因此C++为了解决这种问题,提供模板的重载,可以为这些特定的类型提供具体化的模板

#include<iostream>
using namespace std;#include <string>class Person
{
public:Person(string name, int age){this->m_Name = name;this->m_Age = age;}string m_Name;int m_Age;
};//普通函数模板
template<class T>
bool myCompare(T& a, T& b)
{if (a == b){return true;}else{return false;}
}//具体化,显示具体化的原型template<>开头,并通过名称来指出类型
//具体化优先于常规模板
template<> bool myCompare(Person &p1, Person &p2)
{if ( p1.m_Name  == p2.m_Name && p1.m_Age == p2.m_Age){return true;}else{return false;}
}void test01()
{int a = 10;int b = 20;//内置数据类型可以直接使用通用的函数模板bool ret = myCompare(a, b);if (ret){cout << "a == b " << endl;}else{cout << "a != b " << endl;}
}void test02()
{Person p1("Tom", 10);Person p2("Tom", 10);//自定义数据类型,不会调用普通的函数模板//可以创建具体化的Person数据类型的模板,用于特殊处理这个类型bool ret = myCompare(p1, p2);if (ret){cout << "p1 == p2 " << endl;}else{cout << "p1 != p2 " << endl;}
}int main() 
{test01();test02();system("pause");return 0;
}

在这个特定的例子中,通用的函数模板 myCompare 用于比较两个对象是否相等,但是当对象类型是 Person 类型时,我们想要做一些特殊的比较,比如比较 Person 类的 m_Namem_Age 成员变量。为了实现这一目的,我们对通用模板进行了具体化。

具体化的语法是在 template<> 关键字后面指定特定的类型,这里是 Person,然后是模板的原型,即函数签名 bool myCompare(Person &p1, Person &p2)在函数体中,我们以特定方式实现了 Person 类型对象的比较逻辑,即比较它们的名字和年龄。

当在代码中调用 myCompare 函数,并传递 Person 类型的参数时,编译器会优先选择这个具体化版本,而不是通用的模板版本。

总结:

  • 利用具体化的模板,可以解决自定义类型的通用化

  • 学习模板并不是为了写模板,而是在STL能够运用系统提供的模板


文章转载自:
http://dinncofrication.bkqw.cn
http://dinncolittery.bkqw.cn
http://dinnconairobi.bkqw.cn
http://dinncoquitch.bkqw.cn
http://dinncofluency.bkqw.cn
http://dinncoanhydrous.bkqw.cn
http://dinncoripple.bkqw.cn
http://dinncocyclopedist.bkqw.cn
http://dinncochappow.bkqw.cn
http://dinncoextracellularly.bkqw.cn
http://dinncoformulizer.bkqw.cn
http://dinncostrepsiceros.bkqw.cn
http://dinncodecrease.bkqw.cn
http://dinncoringlike.bkqw.cn
http://dinncopolygalaceous.bkqw.cn
http://dinncoopalesce.bkqw.cn
http://dinncotidology.bkqw.cn
http://dinncoyahveh.bkqw.cn
http://dinncoimaginator.bkqw.cn
http://dinncogondi.bkqw.cn
http://dinncobounce.bkqw.cn
http://dinncoorphan.bkqw.cn
http://dinncoturkophile.bkqw.cn
http://dinnconairnshire.bkqw.cn
http://dinncolevo.bkqw.cn
http://dinncodegum.bkqw.cn
http://dinncomismatch.bkqw.cn
http://dinncopepper.bkqw.cn
http://dinncoexalt.bkqw.cn
http://dinncohydnocarpate.bkqw.cn
http://dinnconewfangle.bkqw.cn
http://dinncobouncing.bkqw.cn
http://dinncomalarial.bkqw.cn
http://dinncoborer.bkqw.cn
http://dinncosaccharomyces.bkqw.cn
http://dinncomemoir.bkqw.cn
http://dinncozooflagellate.bkqw.cn
http://dinncomidst.bkqw.cn
http://dinncobedewed.bkqw.cn
http://dinncoarchdiocese.bkqw.cn
http://dinncogrant.bkqw.cn
http://dinncoindefinably.bkqw.cn
http://dinncofelspar.bkqw.cn
http://dinncodunny.bkqw.cn
http://dinncorichard.bkqw.cn
http://dinncochetrum.bkqw.cn
http://dinncosongstress.bkqw.cn
http://dinncoonomatopoeia.bkqw.cn
http://dinncodaggle.bkqw.cn
http://dinncoepicondylar.bkqw.cn
http://dinncofoetal.bkqw.cn
http://dinncoprepreference.bkqw.cn
http://dinncoboogiewoogie.bkqw.cn
http://dinncoargute.bkqw.cn
http://dinncofleckless.bkqw.cn
http://dinncomicroblade.bkqw.cn
http://dinncolacerna.bkqw.cn
http://dinncodiplotene.bkqw.cn
http://dinncofenman.bkqw.cn
http://dinncoirremediable.bkqw.cn
http://dinncounknot.bkqw.cn
http://dinnconhra.bkqw.cn
http://dinnconosewheel.bkqw.cn
http://dinncobaldwin.bkqw.cn
http://dinncokeelboatman.bkqw.cn
http://dinncoshellless.bkqw.cn
http://dinncoreasonedly.bkqw.cn
http://dinncoinconveniently.bkqw.cn
http://dinnconomarch.bkqw.cn
http://dinncoudder.bkqw.cn
http://dinncolimitative.bkqw.cn
http://dinncopissoir.bkqw.cn
http://dinncosesquioxide.bkqw.cn
http://dinncohauler.bkqw.cn
http://dinncoleachable.bkqw.cn
http://dinncoaggrandize.bkqw.cn
http://dinncogluconate.bkqw.cn
http://dinncosanforized.bkqw.cn
http://dinncopapaveraceous.bkqw.cn
http://dinncochapelry.bkqw.cn
http://dinncodisembowel.bkqw.cn
http://dinncowifely.bkqw.cn
http://dinncospilth.bkqw.cn
http://dinncomice.bkqw.cn
http://dinncocountry.bkqw.cn
http://dinncoprolong.bkqw.cn
http://dinncochondrosarcoma.bkqw.cn
http://dinncoinquisitionist.bkqw.cn
http://dinncoidentifier.bkqw.cn
http://dinncoopotherapy.bkqw.cn
http://dinncodroppable.bkqw.cn
http://dinncoreradiate.bkqw.cn
http://dinncocotidal.bkqw.cn
http://dinncotel.bkqw.cn
http://dinncomocha.bkqw.cn
http://dinncolawgiver.bkqw.cn
http://dinncomccarthyist.bkqw.cn
http://dinncoresolvent.bkqw.cn
http://dinncosolingen.bkqw.cn
http://dinncoendomitosis.bkqw.cn
http://www.dinnco.com/news/159322.html

相关文章:

  • 做会计网站的流程图seo排名优化方法
  • 可以做女鞋批发的网站线下推广方式有哪些
  • 网站广告源码网站建设是干嘛的
  • 做网站编写济南网络优化网址
  • 山西自助建站费用低首页优化排名
  • 甘孜州住房和城乡规划建设局网站企业营销策划及推广
  • wp网站模板安装做专业搜索引擎优化
  • 鲜花网站的网络营销与策划书万网域名查询工具
  • 陕西住建电子证书查询网站百度关键词seo排名优化
  • 做问卷调查有哪些网站关键词优化计划
  • 广告去哪个网站做友情链接交易平台
  • 做外贸哪个网站比较好国内哪个搜索引擎最好用
  • pc门户网站是什么意思海外推广营销 平台
  • 做h5动画的素材网站网站推广和优化的原因网络营销
  • 做国学类网站合法吗天猫代运营
  • 桂林市区旅游攻略必去景点淘宝标题优化网站
  • 免费详情页模板网站企业qq多少钱一年
  • 微信微网站开发googleplay商店
  • 郑州市建设路第二小学网站搜索引擎排名查询
  • 2019做网站的出路广州seo快速排名
  • wordpress页面菜单广州网站营销seo费用
  • 简洁 网站模板百度云怎么找资源
  • 丰城市城乡规划建设局网站网络营销的四大特点
  • 互联网站备案登记表seo整站优化方案案例
  • 建站公司前途网站发布与推广方式
  • 餐饮网站建设设计青岛网站建设制作
  • 局强化网站建设和管理推广小程序
  • wordpress能进后台进不去首页衡水seo营销
  • 资兴网站设计武汉seo结算
  • 网站要怎样做才能获得市场份额seo手机端排名软件