类模板的基本概念

简介: 类模板的基本概念

导航


1.类模块的基本形式

2.类模块与函数模板的区别

3.类模板中成员函数的调用时机

4.类模板对象作函数参数

5.类模板与继承

6.类模板中构造函数及成员函数类外实现

———————————————————————————————————


1.类模块的基本语法


语法:template< class T>

看例子:


#include <iostream>
using namespace std;
#include <string>
template<class TypeName,class TypeAge>  //这里定义未定类型名
class Person
{
public:
  Person(TypeName name,TypeAge age) //构造函数赋值
  {
  this->name = name;
  this->age = age;
  }
  void show()   //进行打印输出
  {
  cout<<"姓名:"<<this->name<<endl;
  cout<<"年龄:"<<this->age<<endl;
  }
  TypeName name;  
  TypeAge age;
};
void test()
{
  //string型及整型
  Person <string,int>p1("小明",15); //这里注意<>中要输入你想要传入的类型,后面再传入参数
  p1.show();
  //int 及 int型
  Person <int,int>p2(14,12);
  p2.show();
}
int main()
{
  test();
  system("pause");
  return 0;
}


注意点:Person <int,int>p2(14,12); 这里<>与后面()传的类型要一致

可以传自己想传入的类型


———————————————————————————————————


2.类模板与函数模板区别


1.类模板使用只能用显示指定类型方式

2.类模板的模板参数可以有默认参数


例:

声明


template<class TypeName,class TypeAge = int>  //这里可以用默认类型参数
class Person
{
public:
  Person(TypeName name,TypeAge age) //构造函数赋值
  {
  this->name = name;
  this->age = age;
  }
  void show()   //进行打印输出
  {
  cout<<"姓名:"<<this->name<<endl;
  cout<<"年龄:"<<this->age<<endl;
  }
  TypeName name;  
  TypeAge age;
};


调用


Person <string,int>p1("小明",15); //这里注意<>中int可加可不加


——————————————————————————————————


3.类模板中成员函数的调用时机


类模板中的成员函数并不是一开始就创建的,只有在调用时才创建

例:


#include <iostream>
using namespace std;
#include <string>
class Person1
{
public:
  void show()
  {
  cout<<"person1调用"<<endl;
  }
};
class Person2
{
public:
  void show1()
  {
  cout<<"person1调用"<<endl;
  }
};
template<class T>  //这里定义未定类型名
class Person
{
public:
  T obj;
  void print()    //在不确定类型前不创建,调用时才创建
  {
  obj.show();
  }
  void print1()
  {
  obj.show1();
  }
};
void test()
{
  Person<Person1>p;
  p.print();
  //p.print1();
}
int main()
{
  test();
  system("pause");
  return 0;
}


———————————————————————————————————


4.类模板对象作函数参数


1.指定传入类型(最常用)


#include <iostream>
using namespace std;
#include <string>
template<class T1,class T2>
class Person
{
public:
  Person(T1 name,T2 age)
  {
  this->name = name;
  this->age = age;
  }
  void show()
  {
  cout<<"名字:"<<name<<" "<<"年龄:"<<age<<endl;
  }
  T1 name;
  T2 age;
};
void getInfo(Person <string,int>&p)  //指定传入类型
{
  p.show();
}
void test()
{
  Person <string,int>p("小明",12);
  getInfo(p);
}
int main()
{
  test();
  system("pause");
  return 0;
}



注意:void getInfo(Person <string,int>&p) //指定传入类型


2.参数模板化


template<class T1,class T2>
void getInfo2(Person <T1,T2>&p)  //参数模板化
{
  p.show();
}


3.整个类模板化


//3.整个类模板化
template<class T1>
void getInfo3(T1 &p)
{
  p.show();
}


———————————————————————————————————


5.类模板与继承


注意:父类是类模板,子类需要指定出父类中T的数据类型

例:


#include <iostream>
using namespace std;
#include <string>
//父模板
template<class T>
class Person
{
public:
  T name;
};
//继承父模板的子模板
template<class T,class T1>
class son:public Person<T>  //继承父模板子类也应该为子模板
{
public:
  son()
  {
  cout<<"T1的类型:"<<typeid(T).name()<<endl;   //从父模板继承过来为int
  cout<<"T2的类型:"<<typeid(T1).name()<<endl;  //此时obj为char型
  }
  T1 obj;
};
void test()
{
  son<int,char>s;  //显示指定类型参数
}
int main()
{
  test();
  system("pause");
  return 0;
}



———————————————————————————————————


6.类模板中构造函数及成员函数类外实现


例:


#include <iostream>
using namespace std;
#include <string>
//类模板
template<class T1,class T2>
class Person
{
public:
  //构造函数
  Person(T1 name,T2 age);
  //成员函数
  void showPerson();
  T1 name;
  T2 age;
};
//构造函数类外声————————————————————————————————————————————————————————————
template<class T1,class T2>
Person<T1,T2>::Person(T1 name,T2 age)
{
  this->name = name;
  this->age = age;
}
//成员函数类外声
template<class T1,class T2>
void Person<T1,T2>::showPerson()
{
  cout<<"姓名:"<<this->name<<" "<<"年龄:"<<this->age<<endl;
}
//————————————————————————————————————————————————————————————————————————————
void test()
{
  Person <string,int>p("小王",15);
  p.showPerson();
}
int main()
{
  test();
  system("pause");
  return 0;
}



注意:类模板成员函数类外实现,需要加上模板参数列表


相关文章
|
4月前
|
编译器 C++
【C++ 泛型编程 基础扫盲】 详解为什么C++ 虚拟成员函数模板不被允许
【C++ 泛型编程 基础扫盲】 详解为什么C++ 虚拟成员函数模板不被允许
41 0
|
10月前
|
编译器 C++
31 C++ - 运算符重载基本概念
31 C++ - 运算符重载基本概念
33 0
|
10月前
|
C语言 数据安全/隐私保护 C++
19 C++ - 类和对象的基本概念
19 C++ - 类和对象的基本概念
38 0
|
17天前
|
安全 程序员 编译器
C#一分钟浅谈:泛型编程基础
在现代软件开发中,泛型编程是一项关键技能,它使开发者能够编写类型安全且可重用的代码。C# 自 2.0 版本起支持泛型编程,本文将从基础概念入手,逐步深入探讨 C# 中的泛型,并通过具体实例帮助理解常见问题及其解决方法。泛型通过类型参数替代具体类型,提高了代码复用性和类型安全性,减少了运行时性能开销。文章详细介绍了如何定义泛型类和方法,并讨论了常见的易错点及解决方案,帮助读者更好地掌握这一技术。
37 11
|
3月前
|
C++
C++类和类模板——入门
C++类和类模板——入门
33 1
|
2月前
|
算法 编译器 程序员
|
4月前
|
存储 编译器 程序员
从C语言到C++④(第二章_类和对象_上篇)->类->封装->this指针(下)
从C语言到C++④(第二章_类和对象_上篇)->类->封装->this指针
22 0
|
4月前
|
Java C语言 C++
从C语言到C++④(第二章_类和对象_上篇)->类->封装->this指针(上)
从C语言到C++④(第二章_类和对象_上篇)->类->封装->this指针
32 0
|
4月前
|
存储 编译器 C语言
从C语言到C++④(第二章_类和对象_上篇)->类->封装->this指针(中)
从C语言到C++④(第二章_类和对象_上篇)->类->封装->this指针
25 0
|
4月前
|
安全 编译器 程序员
【C++ 泛型编程 进阶篇】C++ 可变参数模板的妙用:解决参数不足问题
【C++ 泛型编程 进阶篇】C++ 可变参数模板的妙用:解决参数不足问题
300 0