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

简洁文章类网站郑州seo线下培训

简洁文章类网站,郑州seo线下培训,聚成网站建设,广东网站建设电话函数模板 函数模板使用 函数模板注意事项 自动类型推导,必须推导出一致的数据类型T,才可以使用 模板必须要确定出T的数据类型,才可以使用 普通函数和函数模板的类型转化 普通函数隐式类型转化(char转int) 函数模板正常使用不会发生…

函数模板

函数模板使用

函数模板注意事项

自动类型推导,必须推导出一致的数据类型T,才可以使用

模板必须要确定出T的数据类型,才可以使用

普通函数和函数模板的类型转化

普通函数隐式类型转化(char转int)

函数模板正常使用不会发生隐式类型转化【自动推导】

函数模板隐式类型转化(char转int),需要指定类型

普通函数与函数模板调用

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

普通函数实现的情况

普通函数只有声明的情况

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

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

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

模板局限性

不能比较构造的类

解决方法:1、运算符重载 2、模板重载

模板重载:

类模板

类模板使用

类模板和函数模板区别

1. 类模板没有自动类型推导的使用方式

2. 类模板在模板参数列表中可以有默认参数

类模板中成员函数创建时机

类模板对象做函数参数

1. 指定传入的类型 --- 直接显示对象的数据类型

2. 参数模板化 --- 将对象中的参数变为模板进行传递

3. 整个类模板化 --- 将这个对象类型 模板化进行传递

类模板与继承

指定类型

子类变类模板

类模板成员函数类外实现

类模板分文件编写

person.h文件:

#pragma once
#include <iostream>
using namespace std;template<class T1, class T2>
class Person {
public:T1 m_Name;T2 m_Age;Person(T1 name, T2 age);	//只声明void show();};

person.cpp文件:

#include "person.h"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>::show()
{cout << this->m_Name << " " << this->m_Age << endl;
}

测试代码

void test() {Person<string,int> p("张三",2);p.show();
}

解决方式1:直接包含.cpp源文件

解决方式2:将声明和实现写到同一个文件中,并更改后缀名为.hpp,hpp是约定的名称,并不是强制

将person.h文件改为person.hpp文件【约定俗成的后缀,代表类模板】:

#pragma once
#include <iostream>
using namespace std;template<class T1, class T2>
class Person {
public:T1 m_Name;T2 m_Age;Person(T1 name, T2 age);	//只声明void show();};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>::show()
{cout << this->m_Name << " " << this->m_Age << endl;
}

类模板与友元

全局函数类内实现 - 直接在类内声明友元即可

全局函数类外实现 - 需要提前让编译器知道全局函数的存在

类模板案例

属性设置

private:T* pAddress;		//指针指向在堆区开辟的数组起始地址int m_Capacity;		//数组容量【总体容量】int m_Size;			//数组大小【占有的数据量】

构造函数实现

根据输入的容量进行初始化

	MyArray(int capacity) {		//有参构造,根据容量进行初始化this->m_Capacity = capacity;this->m_Size = 0;this->pAddress = new T[this->m_Capacity];}

根据已有的数组进行初始化

	//拷贝【防止浅拷贝问题】//构造时拷贝【当参数被声明为 const 时,函数内部不能修改这个参数的值。有助于防止意外修改传入的数据,提高代码的安全性和可维护性。】MyArray(const MyArray& arr) {		this->m_Capacity = arr.m_Capacity;this->m_Size = arr.m_Size;//深拷贝this->pAddress = new T[arr.m_Capacity];for (int i = 0; i < arr.m_Size; i++)this->pAddress[i] = arr.pAddress[i];}

析构函数实现

	~MyArray() {		//析构函数,如果堆区不为空,清空,防止出现野指针if (this->pAddress != NULL) {delete[] this->pAddress;}}

重载运算符“=”

	//重载运算符“=”,防止出现浅拷贝MyArray& operator=(const MyArray& arr) {//如果已有数据需要先释放if (this->pAddress != NULL) {delete[] this->pAddress;this->pAddress = NULL;this->m_Capacity = 0;this->m_Size = 0;}this->m_Capacity = arr.m_Capacity;this->m_Size = arr.m_Size;//深拷贝this->pAddress = new T[arr.m_Capacity];for (int i = 0; i < arr.m_Size; i++)this->pAddress[i] = arr.pAddress[i];//返回对象本身//【this存放指向该对象的地址,*this解引用即是对象本身,MyArray&代表引用】//【最终效果就是返回对象本身的引用(引用可以理解为别名,使用引用可以访问该对象)】return *this;				}

实现访问堆区数据

添加数据

	//尾插法void Push_Back(const T& val) {//判断容量是否等于大小【是否数组已经满了】if (this->m_Capacity == this->m_Size) {return;}//未满this->pAddress[this->m_Size] = val;this->m_Size++;			//更新数组大小}

删除数据

	//尾删法void Pop_Back() {//如果数组为空if (this->m_Size == 0) {return;}//不为空this->m_Size--;			//更新数组大小}

访问数据

	//通过下标访问数组T& operator[](int index) {		//返回引用是为了防止出现arr[i] = 10的赋值情况return this->pAddress[index];}

显示记录的参数

	//返回数组容量int getCapacity() {return this->m_Capacity;}//返回数组大小int getSize() {return this->m_Size;}

MyArray.hpp总的实现

#pragma once
#include <iostream>
using namespace std;template<class T>
class MyArray {
public:MyArray(int capacity) {		//有参构造,根据容量进行初始化this->m_Capacity = capacity;this->m_Size = 0;this->pAddress = new T[this->m_Capacity];}//拷贝【防止浅拷贝问题】MyArray(const MyArray& arr) {		//构造时拷贝【当参数被声明为 const 时,函数内部不能修改这个参数的值。这有助于防止意外修改传入的数据,提高代码的安全性和可维护性。】this->m_Capacity = arr.m_Capacity;this->m_Size = arr.m_Size;//深拷贝this->pAddress = new T[arr.m_Capacity];for (int i = 0; i < arr.m_Size; i++)this->pAddress[i] = arr.pAddress[i];}//重载运算符“=”,防止出现浅拷贝MyArray& operator=(const MyArray& arr) {//如果已有数据需要先释放if (this->pAddress != NULL) {delete[] this->pAddress;this->pAddress = NULL;this->m_Capacity = 0;this->m_Size = 0;}this->m_Capacity = arr.m_Capacity;this->m_Size = arr.m_Size;//深拷贝this->pAddress = new T[arr.m_Capacity];for (int i = 0; i < arr.m_Size; i++)this->pAddress[i] = arr.pAddress[i];//返回对象本身//【this存放指向该对象的地址,*this解引用即是对象本身,MyArray&代表引用】//【最终效果就是返回对象本身的引用(引用可以理解为别名,使用引用可以访问该对象)】return *this;				}//尾插法void Push_Back(const T& val) {//判断容量是否等于大小【是否数组已经满了】if (this->m_Capacity == this->m_Size) {return;}//未满this->pAddress[this->m_Size] = val;this->m_Size++;			//更新数组大小}//尾删法void Pop_Back() {//如果数组为空if (this->m_Size == 0) {return;}//不为空this->m_Size--;			//更新数组大小}//通过下标访问数组T& operator[](int index) {		//返回引用是为了防止出现arr[i] = 10的赋值情况return this->pAddress[index];}//返回数组容量int getCapacity() {return this->m_Capacity;}//返回数组大小int getSize() {return this->m_Size;}~MyArray() {		//析构函数,如果堆区不为空,清空,防止出现野指针if (this->pAddress != NULL) {delete[] this->pAddress;}}private:T* pAddress;		//指针指向在堆区开辟的数组起始地址int m_Capacity;		//数组容量【总体容量】int m_Size;			//数组大小【占有的数据量】};

测试代码

class Person {
public:string m_Name;int m_Age;Person() {};Person(string name, int age){this->m_Name = name;this->m_Age = age;}void show(){cout << this->m_Name << " " << this->m_Age << endl;}};void test() {MyArray<int> arr1(5);//MyArray<int> arr2(arr1);//MyArray<int> arr3(100);//arr3 = arr1;for (int i = 0; i < arr1.getCapacity(); i++)arr1.Push_Back(i);cout << "=====================arr1<int>=======================" << endl;cout << "capacity: " << arr1.getCapacity() << endl;cout << "size " << arr1.getSize() << endl;for (int i = 0; i < arr1.getSize(); i++)cout << arr1[i] << endl;arr1.Pop_Back();cout << "==============arr1尾删后================" << endl;cout << "capacity: " << arr1.getCapacity() << endl;cout << "size " << arr1.getSize() << endl;for (int i = 0; i < arr1.getSize(); i++)cout << arr1[i] << endl;MyArray<char> arr2(6);for (int i = 0; i < arr2.getCapacity(); i++)arr2.Push_Back(i+97);cout << "====================arr2<char>=========================" << endl;cout << "capacity: " << arr2.getCapacity() << endl;cout << "size " << arr2.getSize() << endl;for (int i = 0; i < arr2.getSize(); i++)cout << arr2[i] << endl;MyArray<Person> arr3(3);for (int i = 0; i < arr3.getCapacity(); i++) {Person p("man"+ std::to_string(i), i);arr3.Push_Back(p);}cout << "====================arr3<Person>=========================" << endl;cout << "capacity: " << arr3.getCapacity() << endl;cout << "size " << arr3.getSize() << endl;for (int i = 0; i < arr3.getSize(); i++)arr3[i].show();}

http://www.dtcms.com/wzjs/489571.html

相关文章:

  • 多点网络网站制作系统竞价托管哪家专业
  • 做铝材的网站seo教程seo教程
  • 前端和做网站首页排名优化公司
  • 网站建设 广州百度经验发布平台
  • 有没有专门做美食的网站百度网站优化
  • 做网站的小结seo搜索引擎优化论文
  • 电商网站建设设计报告总结个人在线做网站免费
  • 网站建设在哪个软件下做百度霸屏推广靠谱吗
  • 东莞网站建设在哪里网站开发的公司
  • 网站开发core文件作用推广项目的平台
  • 电脑网站滚动字幕怎么做线上营销渠道
  • 网站建设模板免费下载营销广告
  • 深圳做地铁的公司网站东莞百度推广优化
  • 做网站用windows和 linux免费的十大免费货源网站
  • 建设个人网站的要求seo实战视频
  • 品牌型网站建设的好处seo网站优化快速排名软件
  • 网站结构 网站内容建设短视频赚钱app软件
  • 营销型网站建设申请域名seo综合查询怎么关闭
  • 用php做视频网站百度手机助手下载安卓版
  • 做360效果图网站西安seo服务
  • 广州网站建设制作公司搜索引擎优化常用方法
  • 惠州 网站建设网络建站工作室
  • 网站建设记账设计网站都有哪些
  • 业务员自己做网站奶茶软文案例300字
  • 如何做网站微信支付深圳推广公司推荐
  • 收藏网站的链接怎么做的seo网站免费优化软件
  • 广东河源网站建设网络营销的主要传播渠道是
  • 筑梦网站建设百度新闻头条
  • 国际网站推广专员招聘网络营销课程个人总结范文
  • 香港建立网站seo推广软件