C++学习笔记20190706_泛型编程
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了C++学习笔记20190706_泛型编程,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含3268字,纯文字阅读大概需要5分钟。
内容图文
1函数模板的使用
1.template<class/typename T>告诉编译器紧跟的代码里出现T不要报错
2.mySwap(T &a, T &b)类型也需要传入,类型参数化
3.mySwap(a, b)自动类型推导 按照ab的类型来替换
4.mySwap(a, b)显示指定类型
2函数模板与普通函数的区别以及调用规则
1.区别 普通函数可以进行隐式类型转换 模板不可以
调用规则
1.C++编译器优先考虑普通函数
2.可以通过空模板实参列表的语法限定编译器只能通过模板匹配
3函数模板可以像普通函数那样可以被重载
如果函数模板可以产生一个更好的匹配,那么选择模板
模板的机制
1.模板不是万能的,不能通用所有的数据类型
2.模板不能直接的调用,生成后的模板函数才可以调用
3.二次编译,第一次模板进行编译。第二次对替换T类后的代码进行编译
3模板的局限性
1通过具体化自定义数据类型,解决上述问题
2如果具体化能够优先匹配,那么就选择具体匹配
3语法 template<> 返回值 函数名<具体类型>(参数)
4类模板
1写法
//类模板
template <class NameType, class AgeType = int>//类模板可以有默认参数
class Person
{
public:
Person(NameType name, AgeType age)
{
this->m_Name = name;
this->m_Age = age;
}
void showperson()
{
cout << "姓名:" << this->m_Name << "年龄:" << this->m_Age << endl;
}
NameType m_Name;
AgeType m_Age;
};
调用
Person<string, int> p("孙悟空", 100);
p.showperson();
2.与函数模板区别,可以有默认参数类型
3.函数模板可以进行自动类型推导
5类模板做函数参数(三种类型)
1.显示指定类型
void doWork(Person<string, int> & p)
{
p.showperson();
}
void test01()
{
Person<string, int> p("MT", 10);
doWork(p);
}
2参数模板化
template <class T1, class T2>
void doWork2(Person<T1, T2> & p)
{
//查看类型
cout << typeid(T1).name() << endl;
cout << typeid(T2).name() << endl;
p.showperson();
}
void test02()
{
Person<string, int> p("MT", 10);
doWork2(p);
}
3.整体类型化
template<class T>
void doWork3(T&p)
{
cout << typeid(T).name() << endl;
p.showperson();
}
void test03()
{
Person<string, int> p("猎人", 18);
doWork3(p);
}
6当模板碰到继承
1.基类如果是模板类,必须让子类高数编译器 基类中的T到底是什么类型
template<class T>
class Base
{
public:
T m_A;
};
//child 继承于base必须告诉base中的T的类型,否则T无法分配内存
class Child : public Base<int>
{
};
2.如果不告诉,那么无法分配内存,编译通过
3利用参数列表class Child : public Base
7类外实现成员函数
template<class T1, class T2>
class Person
{
public:
Person(T1 name, T2 age);
void showPerson();
T1 m_Name;
T2 m_Age;
};
//类外实现成员函数
template <class T1, class T2>
Person<T1, T2>::Person(T1 name, T2 age)
{
this->m_Name = name;
this->m_Age = age;
}
template <class T1, class T2>
void Person<T1, T2>::showPerson()
{
cout << "姓名:" << this->m_Name << "年龄: " << this->m_Age << endl;
}
8特别注意建议模板不要做分文件编写,写到一个类即可
1 .h和.cpp分别写声明和实现
2. 但是由于类模板的成员函数运行阶段采取创建,导致包含.h头文件,不会创建函数的实现,无法解析外部命令
3. 解决方案 保护.cpp文件
4. 不要进行分文件,写到同一个文件中,进行声明和实现,后缀名改为.hpp约定俗成
9类模板碰到友元函数
1.友元函数类内实现
template<class T1, class T2>
class Person
{
//友元函数类内实现
friend void printPerson(Person<T1, T2> & p)
{
cout << "姓名: " << p.m_Name << "年龄: " << p.m_Age << endl;
}
public:
Person(T1 name, T2 age)
{
this->m_Name = name;
this->m_Age = age;
}
private:
T1 m_Name;
T2 m_Age;
};
10类模板友元函数的内外实现
1.friend void printPerson<>(Person<T1, T2> & p);//没有<>为普通函数声明 有<>为模板函数声明
2.让编译器看到模板函数并且看到Person类型
通用数组个数计算历程
int num2 = sizeof(intArr) / sizeof(int)
内容总结
以上是互联网集市为您收集整理的C++学习笔记20190706_泛型编程全部内容,希望文章能够帮你解决C++学习笔记20190706_泛型编程所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。