您的位置:首页 > 财经 > 金融 > 新闻网站界面设计_微信二次开发_2023年小学生简短小新闻_sem广告投放是做什么的

新闻网站界面设计_微信二次开发_2023年小学生简短小新闻_sem广告投放是做什么的

2025/1/16 7:59:09 来源:https://blog.csdn.net/QoQ_____________/article/details/142466532  浏览:    关键词:新闻网站界面设计_微信二次开发_2023年小学生简短小新闻_sem广告投放是做什么的
新闻网站界面设计_微信二次开发_2023年小学生简短小新闻_sem广告投放是做什么的

模板(泛型编程)


模板不可以直接使用,它只是一个框架

1.函数模板

2.类模板

函数模板 


template < typename T >

typename仅限于在函数模板中使用,class通用

函数模板在调用时,


1.自动推导,直接调用 swapp(a,b)

2.确定参数类型,swapp <int>(a,b)

 普通函数 && 函数模板


两者重载时,优先调用普通函数,若想先调用函数模板,加空<> myPrint < > (a, b);

函数模板也可重载

 类模板


调用时必须确定参数类型

 

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

 

 类模板中的函数 创建时机


* 普通类中的成员函数一开始就可以创建
* 类模板中的成员函数在调用时才创建

类模板与 继承 


子类在声明的时候,要指定出父类中T的类型

也可迭代,主函数里再声明类型

 

template<class T>
class Base
{T m;
};//class Son:public Base  //错误,c++编译需要给子类分配内存,必须知道父类中T的类型才可以向下继承
class Son :public Base<int> //必须指定一个类型
{
};
void test01()
{Son c;
}//类模板继承类模板 ,可以用T2指定父类中的T类型
template<class T1, class T2>
class Son2 :public Base<T2>
{
public:Son2(){cout << typeid(T1).name() << endl;cout << typeid(T2).name() << endl;}
};void test02()
{Son2<int, char> child1;
}int main() {test01();test02();system("pause");return 0;
}

构造函数,类外实现

成员函数,类外实现


注意 书写格式 即可

 

类模板分文件编写 .hpp


原因:类模板中成员函数创建时机是在调用阶段,导致分文件编写时链接不到 

解决方法:将声明和实现写到同一个文件中,并更改后缀名为.hpp


类模板分文件编写.hpp中代码
#pragma once
#include <iostream>
using namespace std;
#include <string>template<class T1, class T2>
class Person {
public:Person(T1 name, T2 age);void showPerson();
public: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;
}
```类模板分文件编写.cpp中代码```C++
#include<iostream>
using namespace std;//#include "person.h"
#include "person.cpp" //解决方式1,包含cpp源文件//解决方式2,将声明和实现写到一起,文件后缀名改为.hpp
#include "person.hpp"
void test01()
{Person<string, int> p("Tom", 10);p.showPerson();
}int main() {test01();system("pause");return 0;
}

 test 数组模板

数组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;pAddress = new T[this->m_Capacity];}//拷贝构造MyArray(const MyArray & arr){this->m_Capacity = arr.m_Capacity;this->m_Size = arr.m_Size;this->pAddress = new T[this->m_Capacity];for (int i = 0; i < this->m_Size; i++){//如果T为对象,而且还包含指针,必须需要重载 = 操作符,因为这个等号不是 构造 而是赋值,// 普通类型可以直接= 但是指针类型需要深拷贝this->pAddress[i] = arr.pAddress[i];}}//重载= 操作符  防止浅拷贝问题MyArray& operator=(const MyArray& myarray) {if (this->pAddress != NULL) {delete[] this->pAddress;this->m_Capacity = 0;this->m_Size = 0;}this->m_Capacity = myarray.m_Capacity;this->m_Size = myarray.m_Size;this->pAddress = new T[this->m_Capacity];for (int i = 0; i < this->m_Size; i++) {this->pAddress[i] = myarray[i];}return *this;}//重载[] 操作符  arr[0]T& operator [](int index){return this->pAddress[index]; //不考虑越界,用户自己去处理}//尾插法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--;}//获取数组容量int getCapacity(){return this->m_Capacity;}//获取数组大小int	getSize(){return this->m_Size;}//析构~MyArray(){if (this->pAddress != NULL){delete[] this->pAddress;this->pAddress = NULL;this->m_Capacity = 0;this->m_Size = 0;}}private:T * pAddress;  //指向一个堆空间,这个空间存储真正的数据int m_Capacity; //容量int m_Size;   // 大小
};

数组类封装.cpp: 

#include "myArray.hpp"
#include <string>void printIntArray(MyArray<int>& arr) {for (int i = 0; i < arr.getSize(); i++) {cout << arr[i] << " ";}cout << endl;
}//测试内置数据类型
void test01()
{MyArray<int> array1(10);for (int i = 0; i < 10; i++){array1.Push_back(i);}cout << "array1打印输出:" << endl;printIntArray(array1);cout << "array1的大小:" << array1.getSize() << endl;cout << "array1的容量:" << array1.getCapacity() << endl;cout << "--------------------------" << endl;MyArray<int> array2(array1);array2.Pop_back();cout << "array2打印输出:" << endl;printIntArray(array2);cout << "array2的大小:" << array2.getSize() << endl;cout << "array2的容量:" << array2.getCapacity() << endl;
}//测试自定义数据类型
class Person {
public:Person() {} Person(string name, int age) {this->m_Name = name;this->m_Age = age;}
public:string m_Name;int m_Age;
};void printPersonArray(MyArray<Person>& personArr)
{for (int i = 0; i < personArr.getSize(); i++) {cout << "姓名:" << personArr[i].m_Name << " 年龄: " << personArr[i].m_Age << endl;}}void test02()
{//创建数组MyArray<Person> pArray(10);Person p1("孙悟空", 30);Person p2("韩信", 20);Person p3("妲己", 18);Person p4("王昭君", 15);Person p5("赵云", 24);//插入数据pArray.Push_back(p1);pArray.Push_back(p2);pArray.Push_back(p3);pArray.Push_back(p4);pArray.Push_back(p5);printPersonArray(pArray);cout << "pArray的大小:" << pArray.getSize() << endl;cout << "pArray的容量:" << pArray.getCapacity() << endl;}int main() {//test01();test02();system("pause");return 0;
}

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com