编程语言
首页 > 编程语言> > C++学习笔记20190706_泛型编程

C++学习笔记20190706_泛型编程

作者:互联网

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)

标签:20190706,函数,void,C++,Person,template,泛型,Age,模板
来源: https://blog.csdn.net/qq_33346150/article/details/94890379