C/C++语言是一种通用的编程语言,具有高效、灵活和可移植等特点。C语言主要用于系统编程,如操作系统、编译器、数据库等;C语言是C语言的扩展,增加了面向对象编程的特性,适用于大型软件系统、图形用户界面、嵌入式系统等。C/C++语言具有很高的效率和控制能力,但也需要开发人员自行管理内存等底层资源,对于初学者来说可能会有一定的难度。

函数模板的基本使用: 函数模板就是要实现类型参数化,实现泛型编程,就是可以动态的调整数据类型.

#include <iostream>
#include <typeinfo> using namespace std; // template<> 告诉编译器,下面如果出现T不要报错,T是一个通用的类型
template<class T>
void MySwap(T &x, T &y)
{
T tmp = x;
x = y;
y = tmp;
} template<class T>
T MyAdd(T &x, T &y)
{
return x + y;
} // 此处的typename = class
template<typename T>
void MyPrint()
{
T number;
cout << "type = " << typeid(T).name() << endl;
} int main(int argc, char *argv[])
{
// 自动类型推导: 必须要有参数才能推到(根据参数来确定类型)
int x = 10, y = 20;
MySwap(x, y);
cout << "x= " << x << endl; int ret = MyAdd(x, y);
cout << "x+y = " << ret << endl; // 手动类型指定: 如果参数不一致,可能会报错,此时我们需要告诉它类型
MySwap<int>(x, y);
cout << "x= " << x << endl; // 针对无参数函数处理: 有些函数没有参数,我们需要指定模板默认类型
MyPrint<int>();
MyPrint<double>(); system("pause");
return 0;
}

我们在上面的案例基础上进行一定的加强,通过模板实现一个选择排序,我们可以传入任意的数据类型,都可被解析.

#include <iostream>
#include <typeinfo> using namespace std; template<class T>
void MySwap(T &x, T &y)
{
T tmp = x;
x = y;
y = tmp;
} template<class T>
void SelectSort(T Array[], int len)
{
for (int x = 0; x < len; x++)
{
int max = x;
for (int y = x + 1; y < len; y++)
{
if (Array[max] > Array[y])
max = y;
}
if (max != x)
MySwap(Array[max], Array[x]);
}
} template<class T>
void MyPrint(T Array[], int len)
{
for (int x = 0; x < len; x++)
cout << Array[x] << " ";
} int main(int argc,char *argv[])
{
int Int_Array[10] = { 4, 7, 8, 2, 1, 8, 0, 3, 2, 7 };
SelectSort<int>(Int_Array, 10);
MyPrint<int>(Int_Array, 10); char Char_Array[] = "hello lyshark";
int len = sizeof(Char_Array) / sizeof (char);
SelectSort<char>(Char_Array, len);
MyPrint<char>(Char_Array, len); system("pause");
return 0;
}

实现模板具体化: 通过自定义模板函数,解决模板的局限性问题.

#include <iostream>

using namespace std;

class Student
{
public:
char *m_name;
int m_age;
public:
Student(char *name, int age)
{
this->m_name = name;
this->m_age = age;
}
}; template<class Student>
bool MyCompare(Student &x, Student &y)
{
if (x.m_age == y.m_age)
return true;
return false;
} int main(int argc, char *argv[])
{
Student stu1("lyshark", 22);
Student stu2("admin", 33); bool ret = MyCompare(stu1, stu1);
cout << ret << endl; bool ret1 = MyCompare(stu1, stu2);
cout << ret1 << endl; system("pause");
return 0;
}

定义并使用类模板: 类模板不支持类型的自动推导,所以必须在调用时Student<string, int>显式指定好类型.

#include <iostream>
#include <string> using namespace std; template<class NameType = string,class AgeType = int> // 类模板可以指定默认参数
class Student
{
public:
string m_name;
int m_age; public:
Student(NameType name,AgeType age)
{
this->m_name = name;
this->m_age = age;
}
void show() { cout << "name = " << m_name << endl; }
}; template<class Student>
bool MyCompare(Student &x, Student &y)
{
if (x.m_age == y.m_age)
return true;
return false;
} int main(int argc, char *argv[])
{
// 调用类模板是要在类后面添加参数列表
Student<string, int> stu1("lyshark", 25);
stu1.show(); system("pause");
return 0;
}

类模板做函数参数传递: 此处我们将类模板Student<string, int>当做函数参数传递给MyPrint函数.

#include <iostream>
#include <string> using namespace std; template<class NameType,class AgeType>
class Student
{
public:
string m_name;
int m_age; public:
Student(NameType name,AgeType age)
{
this->m_name = name;
this->m_age = age;
}
void show() { cout << "name = " << m_name << endl; }
}; void MyPrintA(Student<string, int> &ptr)
{ ptr.show(); } template<class T1,class T2>
void MyPrintB(Student<T1,T2> &ptr)
{ ptr.show(); } template<class T>
void MyPrintC(T &ptr)
{ ptr.show(); } int main(int argc, char *argv[])
{
// 1. 指定传入的类型直接调用
Student<string, int> stu1("lyshark", 25);
MyPrintA(stu1); // 2. 参数模板化调用
Student<string, int> stu2("admin", 10);
MyPrintB(stu2); // 3.整体模板化调用
Student<string, int> stu3("root", 10);
MyPrintC(stu3); system("pause");
return 0;
}

类模板类内定义类外实现: 类模板同样支持类内定义模板类型,在类外部对其进行具体的实现.


#include <iostream>
#include <string> using namespace std; template<class NameType,class AgeType>
class Student
{
public:
string m_name;
int m_age; public:
Student(NameType name, AgeType age);
void show();
}; // 类外实现成员构造函数
template <class NameType,class AgeType>
Student<NameType, AgeType>::Student(NameType name, AgeType age)
{
this->m_name = name;
this->m_age = age;
} // 类外实现打印函数
template <class NameType,class AgeType>
void Student<NameType, AgeType>::show()
{
cout << "Name = " << this->m_name << endl;
} int main(int argc, char *argv[])
{
Student<string, int> stu("lyshark", 20);
stu.show(); system("pause");
return 0;
}

类模板友元函数类内实现: 友元函数就是可以让类外直接访问的函数,调用类内友元函数就像调用全局函数一样.

#include <iostream>
#include <string> using namespace std; template<class NameType,class AgeType>
class Student
{
// 友元函数的类内实现
friend void show(Student<NameType, AgeType> &ptr)
{
cout << "name = " << ptr.m_name << endl;
} private:
string m_name;
int m_age;
public:
Student(NameType name, AgeType age)
{
this->m_name = name;
this->m_age = age;
}
}; int main(int argc, char *argv[])
{
Student<string, int> stu("lyshark", 20);
// 此处调用,类似于全局调用
show(stu); system("pause");
return 0;
}

类模板友元函数类外实现: 类外实现同理,就是现在类内声明类型作为占位符,然后在类外进行实现.

#include <iostream>
#include <string> using namespace std; // 类外实现必须提前声明模板的存在
template<class T1, class T2> class Student;
template<class T1, class T2> void show(Student<T1, T2> & p); template<class T1,class T2>
class Student
{
// 友元函数类内实现,利用空参数列表声明 (占位符)
friend void show<>(Student<T1, T2> &ptr); private:
string m_name;
int m_age; public:
Student(T1 name, T2 age)
{
this->m_name = name;
this->m_age = age;
}
}; // 对友元函数的类外实现
template<class T1,class T2>
void show(Student<T1,T2> &ptr)
{
cout << "name = " << ptr.m_name << endl;
} int main(int argc, char *argv[])
{
Student<string, int> stu("lyshark", 20);
// 此处调用,类似于全局调用
show(stu); system("pause");
return 0;
}

8.6 C++ 泛型化编程态的更多相关文章

  1. Java中的泛型 --- Java 编程思想

    前言 ​ 我一直都认为泛型是程序语言设计中一个非常基础,重要的概念,Java 中的泛型到底是怎么样的,为什么会有泛型,泛型怎么发展出来的.通透理解泛型是学好基础里面中非常重要的.于是,我对<Ja ...

  2. 从xfire谈WebService接口化编程

    前段时间有博友在看我的博文<WebService入门案例>后,发邮件问我关于WebService 接口在java中的开发,以及在实际生产环境中的应用.想想自己入职也有一段时间了,似乎也该总 ...

  3. Deep Learning 2_深度学习UFLDL教程:矢量化编程(斯坦福大学深度学习教程)

    1前言 本节主要是让人用矢量化编程代替效率比较低的for循环. 在前一节的Sparse Autoencoder练习中已经实现了矢量化编程,所以与前一节的区别只在于本节训练集是用MINIST数据集,而上 ...

  4. 6.6.2 自己主动泛型化(automatic generalization)

    6.6.2 自己主动泛型化(automatic generalization) 在这一章,我们已经实现了几个 F# 的高阶函数.也看到了在 F# 和 C# 中并排的实现.F# 实现的非常重要方面,是我 ...

  5. React 面向组件化编程 - 封装了webpack - npm run build 产生的包的 /static 引用路径问题

    React 面向组件化编程 面向对象 ----> 面向模块 ----> 面向组件 套路: 注意: 组件名必须大写开头: 只能有一个根标签: <input />虚拟DOM 元素必 ...

  6. c++以代理的方式来实现接口化编程

      假如你项目代码本身已经实现了很多的实体类,但并未采用接口,可以考虑以这种方式来实现接口化编程 struct ITest { virtual void Test()=0; }; class CTes ...

  7. linux无锁化编程--__sync_fetch_and_add系列原子操作函数

    linux支持的哪些操作是具有原子特性的?知道这些东西是理解和设计无锁化编程算法的基础. 下面的东西整理自网络.先感谢大家的分享! __sync_fetch_and_add系列的命令,发现这个系列命令 ...

  8. 初探CORBA组件化编程

    1.掌握组件化开发的概念,了解CORBA模型及ORB机制:2.掌握CORBA组件编程方法.二.实验内容(一).步骤1.配制环境JDK环境.2.编写编译IDL接口.3.编写编译服务端程序.4.编写编译客 ...

  9. vue组件化编程应用2

    写几个小案例来理解vue的组件化编程思想,下面是一个demo. 效果图示: 需求: header部输入任务,进行添加,在list中显示; list中每个item项,鼠标移入时,背景变灰并显示delet ...

  10. vue组件化编程应用

    写几个小案例来理解vue的组件化编程思想,下面是一个demo. 效果图示: 功能: Add组件用于添加用户评论,提交后右边评论回复会立马显示数据.Item组件点击删除可以删除当前用户评论.当List组 ...

随机推荐

  1. 基于C++11特性的线程池

    写在前面:本文学习自基于C++11实现线程池,代码部分均属于该博主,自己只是想记录以下自己的认知,并以这种方式加深一下自己对于多线程的理解 1 前置知识 RAII管理机制 简单来说RAII机制是一种对 ...

  2. 【JAVA基础】常量变量维护

    常量维护 //参与签名的系统Header前缀,只有指定前缀的Header才会参与到签名中 //换行符 private static final char LF = '\n'; public stati ...

  3. Codeforce:4C. Registration system (映射)

    A new e-mail service "Berlandesk" is going to be opened in Berland in the near future. The ...

  4. 源码深度解析 Handler 机制及应用

    本文以源码分析+实际应用的形式,详细讲解了 Handler 机制的原理,以及在开发中的使用场景和要注意的地方. 一.基本原理回顾 在 Android 开发中,Handler及相关衍生类的应用经常用到, ...

  5. Java虚拟机——类加载器深入剖析

    一.java虚拟机与程序的生命周期 在如下几种情况下,java虚拟机将结束生命周期: 1.执行了System.exit()方法 2.程序正常执行结束 3.程序在执行过程中遇到了异常或错误而异常终止 4 ...

  6. java进阶(16)--System常用方法总结

    一.Systen.out静态变量 静态变量,用的最多的是调用print方法   二.System.out.println() println()其实是printStream类的方法   三.Sytem ...

  7. Nginx Location 深入剖析及动静分离简易配置

    本文为博主原创,未经允许不得转载: 1. location 使用分析 location 是 Nginx 配置 中的一个指令,用于访问的 URL 匹配,而在这个 location 中所配置的每个指令将会 ...

  8. 【开源分享】基于Html开发的房贷计算器,模仿新浪财经

    房贷计算器是一种房贷计算的在线计算Web应用,按用户选择的贷款类型.贷款金额.期限.利率可计算得出每月月供参考.支付利息.还款总额这些信息.本文模仿新浪财经开发的房贷计算器. 作品预览 https:/ ...

  9. 小程序:Now you can provide attr `wx:key` for a `wx:for` to improve performance. 的解决方案

    在wx:for后面添加wx:key="key" 可消除警告 <view wx:for="{{thisWeekMovies}}" wx:for-index= ...

  10. [转帖]Shell if 条件判断

      Shell  语言中的if条件 一.if的基本语法: if [ command ];then    符合该条件执行的语句 elif [ command ];then    符合该条件执行的语句 e ...