这一章主要讲类模板,包括它的主要用法和作用,简单写了一下和普通类的异同。
本文主要为学习心得笔记,如有纰漏,欢迎指正
与模板函数相同,若想要将类中的某个数据类型抽象化,在使用是再指定需要的数据类型,就需要使用模板类来实现。
template<class T> //class 可以用typename替换
class 类名
{
//...
};
template<class T = 数据类型>
//有默认参数类型的类模板
template<class NameT, class IdT = int>
class Person1
{
NameT name;
IdT id;
public:
Person1(NameT name, IdT id)
{
this->name = name;
this->id = id;
}
void myPrint()
{
cout << name << endl;
cout << id << endl;
}
};
void test1()
{
//错误用法,没有传入参数类型
//Person1<> p("gzy", 10);
//Person1 p("gzy", 10);
//调用有默认参数类型的类模板
Person1<string> p("gzy", 'a'); //会发生隐式类型转化
Person1<string, char> p1("gzy", 'a');
p.myPrint();
}
void printPerson1(Person<string, int> &p){}
template<class T1, class T2>
void printPerson2(Person<T1, T2> &p){}
template<class T>
void printPerson3(T & p){}
如果父类是一个类模板,则子类在继承时必须指定父类T的类型
template<class T>
class Base
{
T m;
};
//可以直接尖括号跟后面
class Son : public Base <int> {}
template<class T>
class Base
{
T m;
};
template<class T>
class Son : public Base<T> {}
template<class NameT, class IdT>
class Person
{
NameT name;
IdT id;
public:
Person(NameT name, IdT id);
};
//构造函数类外实现:
template<class T1, class T2>
Person<T1, T2>::Person(){}
template<class T1, class T2>
void Person<T1, T2>::func(){}
注:后面案例会写
注:类内成员函数加上friend关键字后就会变为全局函数
注:这里写的功能比较杂,只作为参考,练习使用。
#pragma once
#include
#include
using namespace std;
template<class T>
class myVector
{
T* arr;
int capacity = 4;
int count;
public:
/*四个构造函数*/
myVector();
myVector(int capacity);
myVector(int capacity, T ele);
myVector(const myVector& p);
/*析构函数*/
~myVector();
/*重载运算符*/
myVector& operator= (const myVector& p);
/*尾插*/
void push_back(const T& val);
/*尾删*/
void pop_back();
/*重载[]*/
T& operator[] (int index);
/*打印*/
void print();
};
template<class T>
myVector<T>::myVector()
{
capacity = 4;
arr = new T[4];
count = 0;
}
template<class T>
myVector<T>::myVector(int capacity)
{
this->capacity = 4;
while (this->capacity < capacity)
{
this->capacity <<= 1;
}
arr = new T[this->capacity];
count = capacity;
}
template<class T>
myVector<T>::myVector(int capacity, T ele)
{
while (this->capacity < capacity)
{
this->capacity <<= 1;
}
arr = new T[this->capacity];
count = capacity;
for (int i = 0; i < count; i++)
{
arr[i] = ele;
}
}
template<class T>
myVector<T>::myVector(const myVector& p)
{
*this = p; //调用重载的 = 运算符
}
template<class T>
myVector<T>::~myVector()
{
if (arr != nullptr)
{
delete[] arr;
arr = nullptr;
}
capacity = 0;
count = 0;
}
template<class T>
myVector<T>& myVector<T>::operator= (const myVector& p)
{
myVector<T>::~myVector(); //可以手动调用析构函数
count = p.count;
capacity = p.capacity;
arr = new T[capacity];
copy(p.arr, p.arr + count, arr);
return *this;
}
template<class T>
void myVector<T>::push_back(const T& val)
{
if (capacity <= count) //扩容
{
capacity <<= 1;
T* newArr = new T[capacity];
copy(arr, arr + count, newArr);
delete arr;
arr = newArr;
}
arr[count] = val;
count++;
}
template<class T>
void myVector<T>::pop_back()
{
count -= (count > 0 ? 1 : 0);
}
template<class T>
T& myVector<T>::operator[] (int index)
{
return arr[index]; // 使用[]来改变数值
}
template<class T>
void myVector<T>::print()
{
for (int i = 0; i < count; i++)
{
cout << arr[i] << endl;
}
}
这一章主要记录模板类的学习,模板类的使用注意事项。