类模板的基本概念

简介: 类模板的基本概念

导航


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;
}



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


相关文章
|
7月前
|
编译器 C++
【C++ 泛型编程 基础扫盲】 详解为什么C++ 虚拟成员函数模板不被允许
【C++ 泛型编程 基础扫盲】 详解为什么C++ 虚拟成员函数模板不被允许
57 0
|
编译器 C++
31 C++ - 运算符重载基本概念
31 C++ - 运算符重载基本概念
39 0
|
C语言 数据安全/隐私保护 C++
19 C++ - 类和对象的基本概念
19 C++ - 类和对象的基本概念
53 0
|
2月前
|
编译器 C语言 C++
C++入门6——模板(泛型编程、函数模板、类模板)
C++入门6——模板(泛型编程、函数模板、类模板)
60 0
C++入门6——模板(泛型编程、函数模板、类模板)
|
6月前
|
C++
C++类和类模板——入门
C++类和类模板——入门
45 1
|
6月前
|
算法 安全 编译器
【C++进阶】模板进阶与仿函数:C++编程中的泛型与函数式编程思想
【C++进阶】模板进阶与仿函数:C++编程中的泛型与函数式编程思想
61 1
|
5月前
|
算法 编译器 程序员
|
6月前
|
编译器
模板初阶(1):函数模板,类模板
模板初阶(1):函数模板,类模板
|
6月前
|
Java 数据库 Spring
再申明一次:面向对象编程不是面向人编程
这段内容是关于编程方法的设计说明:方法未封装,因为仅作者自己调用;RPC方法的日期参数用String,因知其格式;为使用Spring事务,将两个数据库操作合并到一个方法;方法名具有特定用途,不被其他地方调用;返回值用Map,调用者了解取值方式。此外,讨论了类和方法的封装性,强调封装对代码隔离、模块化、可读性和可测试性的益处。
|
算法 编译器 C++
C++泛型编程之类模板
C++泛型编程之类模板
55 0
下一篇
DataWorks