STL2-类模板

1、类模板实现

函数模板在调用时可以自动类型推导
类模板必须显式指定类型

#include<iostream>
using namespace std;template<class T>
class Person {
public:T mId;T mAge;
public:Person(T id,T age){this->mAge = age;this->mId = id;}void Show(){cout << "ID:" << mId << " Age:" << mAge << endl;}
};void test01()
{//函数模板在调用时可以自动类型推导//类模板必须显式指定类型Person<int> p(10, 20);p.Show();
}int main(void)
{test01();return 0;
}

 

2、类模板派生普通类

注意:

(1)class Cat :public Animal<int>   //继承时必须指定类型

(2)Cat(int age,int id ,int color):Animal<int>(age,id)  //构造函数也需要继承

#include<iostream>using namespace std;
template<class T>
class Animal
{
public:T mAge;T mId;public:Animal(T age, T id){this->mAge = age;this->mId = id;}void Show(){cout << "父类" << endl;cout << "ID:" << mId << " Age:" << mAge << endl;}
};
class Cat :public Animal<int>   //继承时必须指定类型
{
public:int mColor;
public:Cat(int age,int id ,int color):Animal<int>(age,id){mAge = age;mId = id;this->mColor = color;}void Show(){cout << "子类" << endl;cout << "ID:" << mId << " Age:" << mAge<< " mColor:"<<mColor<< endl;}};int main(void)
{Animal<int> a(12,12);a.Show();Cat c(1,1,1);c.Show();return 0;
}

运行结果: 

3、类模板派生类模板

注意:

(1)template<class T> class B:public A<T> //继承时不需要指定类型

(2)B(T age,T id ,T color):A<T>(age,id)  //虽然不需要具体指定类型但是构造函数也需要继承

#include<iostream>using namespace std;
template<class T>
class A
{
public:T mAge;T mId;public:A(T age, T id){this->mAge = age;this->mId = id;}void Show(){cout << "父类" << endl;cout << "ID:" << mId << " Age:" << mAge << endl;}
};
template<class T>
class B :public A<T>   //继承时必须指定类型
{
public:int mColor;
public:B(T age,T id ,T color):A<T>(age,id){mAge = age;mId = id;this->mColor = color;}void Show(){cout << "子类" << endl;cout << "ID:" << mId << " Age:" << mAge<< " mColor:"<<mColor<< endl;}};int main(void)
{A<int> a(12,12);a.Show();B<double> c(1.21,1.22,1.23);c.Show();return 0;
}

运行结果:

4、类模板类外实现

注意类模板中友缘函数的使用

#include<iostream>
using namespace std;//不要滥用友缘函数//类外声明 普通友缘函数方法二
template<class T> class Person;
template<class T> void PrintPerson(Person<T>& p);template<class T>
class Person {
public://重载左移操作符  此方法linux可能编译不通过template<class T>friend ostream& operator<<(ostream& os, Person<T>& p);//friend ostream& operator<<<T>(ostream& os, Person<T>& p);//普通友缘函数方法一  需要添加template<class T>/*template<class T>friend void PrintPerson(Person<T>& p);*///普通友缘函数方法二 friend void PrintPerson<T>(Person<T>& p);Person(T age, T id);void show();
private:T mAge;T mID;
};template<class T>
Person<T>::Person(T age, T id)
{this->mID = id;this->mAge = age;
}
template<class T>
void PrintPerson(Person<T>& p)
{cout << "Age:" << p.mAge << " ID:" << p.mID << endl;
}
template<class T>
void Person<T>::show()
{cout << "Age:" << mAge << " ID:" << mID << endl;
}//重载左移运算操作符
template<class T>
ostream& operator<<(ostream &os, Person<T>& p)
{os << "Age:" << p.mAge << " ID:" << p.mID << endl;return os;
}void test01()
{Person<int> p(10, 20);p.show();PrintPerson(p);cout << p;
}int main(void)
{test01();return 0;
}

5、类模板.h和.cpp分离编写

注意:

(1)一般在写类模板时将Person.h和Person.cpp合并一起写。写为Person.hpp(hpp即h和cpp的合并).否则可能会报错

(2)当分开写时,main.cpp 中include的是Person.cpp。因为只有这样在编译Person<int> p(10)时,编译器才会找到构造函数并生成具体函数使用。当include的时Person.h时,编译main.cpp时,在运行到Person<int> p(10)时,以为会在其他处有声明,然而只有有Person<T>::Person(T age)的声明,而没有具体类型构造函数的声明。(模板函数的二次编译:一次声明编译,一次具体调用编译

如:

Person.h

#pragma once#include <iostream>
using namespace std;//声明是不编译的
template<class T>
class Person {
public:Person(T age);void Show();
public:T mAge;
};

Person.cpp

#include"Person.h"
//函数模板是二次编译
//定义时一次编译,并没有生成具体的函数  
//具体调用第二次编译
template<class T>
Person<T>::Person(T age)
{this->mAge = age;
}template<class T>
void Person<T>::Show()
{cout << "Age:" << mAge << endl;
}

 

main.cpp

#include<iostream>
//#include"Person.h"  错误
#include"Person.cpp"//正确,
//因为Person<int> p(10)在编译时用到Person<T>::Person(T age)生成具体的使用函数
//所以在写类模板时一般写为Person.hpp  意味着h和cpp的合体
int main(void)
{//让链接器找文件//C++独立编译。第一次编译时,构造函数定义在当前文件没有找到//因为此函数有声明,编译器认为这个函数在其他文件中定义//让链接器在链接时 去找这个函数的具体位置,如何实现//然而链接器在链接时,发现并没有此函数的定义,因为次函数的编译是函数模板的第一次编译,找不着//报错Person<int> p(10);p.Show();return 0;
}

运行结果:

6、类模板中static关键字的使用

#include<iostream>
using namespace std;template<class T>
class Person {
public:static int a;
};
//类外初始化
template<class T> int Person<T>::a = 0;
int main(void)
{Person<int> p1, p2, p3;Person<char> pb1, pb2, pb3;p1.a = 10;pb1.a = 100;cout << "p.a:" << p1.a <<" "<<p2.a << " " <<p3.a<< endl;cout << "pb.a:" << pb1.a << " " <<pb2.a << " " <<pb3.a<< endl;return 0;
}

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/567973.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

STL3-MyArray动态数组类模板实现

注意 1、右值的拷贝使用 2、拷贝构造函数的使用 #include<iostream> using namespace std;template<class T> class MyArray{ public:MyArray(int capacity){this->mCapacity capacity;this->mSize 0;//申请内存this->pAddr new T[this->mCapac…

mysql udf提权hex_Mysql_UDF提权

Mysql_UDF提权作者&#xff1a;admin 发布于&#xff1a;2013-5-25 18:55 Saturday分类&#xff1a;MYSQLRoot权限一、上传udf.dll小于mysql5.1版本C:\\WINDOWS\\udf.dll 或C:\\WINDOWS\\system32\\udf.dll等于mysql5.1版本%mysql%\\plugin\\udf.dll 用 selectplugin_dir 查询…

STL4-类型转换

#include<iostream> using namespace std;class Building{}; class Animal{}; class Cat :public Animal {}; //Cat是Animal的子类//static_cast //用于内置的数据类型及具有继承关系的指针或者引用 void test01() {int a 97;//static_cast<要转换的类型>(转换的…

python argparse模块

argparse模块 argparse是python用于解析命令行参数和选项的标准模块&#xff0c;用于代替已经过时的optparse模块 使用步骤 import argparse # 1 导入模块&#xff0c;这个没什么说的 parser argparse.ArgumentParser() # 2 实例化一个对象&#xff0c;默认参数一堆&#…

STL5-异常

异常可以跨函数 异常必须处理 1、 #include<iostream> using namespace std; //c异常机制 跨函数 //c异常必须处理 不能留&#xff0c;否则报错 int divided(int x, int y) {if (y 0)throw y; //抛异常return (x / y); } void test01() {int x 10, y 0;//试着去捕获…

java 并发组件_Java 并发计数组件Striped64详解

作者&#xff1a; 一字马胡转载标志 【2017-11-03】更新日志日期更新内容备注2017-11-03添加转载标志持续更新Java Striped64Striped64是在java8中添加用来支持累加器的并发组件&#xff0c;它可以在并发环境下使用来做某种计数&#xff0c;Striped64的设计思路是在竞争激烈的时…

ubuntu的MySQL远程数据库连接问题查找

1、开放端口3306 2、添加权限 3、服务器本身没有在安全组规则中开放权限 添加安全组规则后重试。

java中集合怎么定义_Java集合系列(一):集合的定义及分类

1. 集合的定义什么是集合呢&#xff1f;定义&#xff1a;集合是一个存放对象的引用的容器。在Java中&#xff0c;集合位于java.util包下。2. 集合和数组的区别(面试常问)提到容器&#xff0c;就会想起数组&#xff0c;那么集合和数组的区别是什么呢&#xff1f;(这里是重点&…

STL6-输入输出流

cout 是 console output 缩写 程序 和键盘 之间有一个输入缓冲区 程序 和 显示器 之间有一个输出缓冲区 #include<iostream> #include<windows.h> #include<iomanip> using namespace std; #if 0 cout << "dd"; //全局流对象&#xff0c;默…

Ubuntu nginx+uwsgi部署Django项目

前提条件&#xff1a;首先项目使用一下命令启动成功后&#xff0c;输入公网ip后可以启动成功 python manage.py runserver 0.0.0.0:80 一、阿里云配置安全组 添加8000端口 二、安装配置uwsgi 1、确定django项目可以正常运行了&#xff0c;ctrlc停止项目&#xff0c;下面我们来…

STL7-基础

1、容器可以嵌套容器 2、容器分为序列式容器和关联式容器 序列式容器&#xff1a;容器的元素的位置是由进入容器时机和地点来决定 关联式容器&#xff1a;容器已经有规则&#xff0c;进入容器的元素的位置不是由进入容器时机和地点来决定 只与此容器的排列规则有关 3、迭代…

java 假设当前时间_Java中与日期和时间相关的类和方法

一、currentTimeMillis()方法System 类中的方法 currentTimeMillis() 方法可以返回从 GMT1970 年 1 月 1 日 00 : 00 : 00 开始到当前时刻的毫秒数。System.currentTimeMillis(); //返回值为long类型二、Date类1.构造方法(1)public Date (); 以当前系统时间创建一个Date对象&am…

STL8-string容器

C 没有 string 类&#xff0c;但提供了直接对字符数组、字符串操作的函数 -> 如 str_len()等等 -> 需要包含 “string.h”#include<iostream> #include<string> using namespace std;//初始化 void test01() {string s1; //调用无参构造string s2(10, a);str…

java 采集 cms_开源 java CMS - FreeCMS2.3 Web页面信息采集

Web页面信息采集从FreeCMS 2.1开始支持通过简单配置即可抓取目标网页信息&#xff0c;支持增量式采集、关键字替换、定时采集&#xff0c;同一采集规则可采集多个页面(静态和动态)&#xff0c;可采集多种信息属性&#xff0c;可自动审核且静态化信息页面。采集规则管理从左侧管…

Python中reshape函数参数-1的意思?

import numpy as np c np.array([[1,2,3],[4,5,6]]) print(2行3列) print(c.reshape(2,3)) print(3行2列) print(c.reshape(3,2)) print(我也不知道几行&#xff0c;反正是一列) print(c.reshape(-1,1)) print(我也不知道几列&#xff0c;反正是一行) print(c.reshape(1,-1)) …

STL9-vector容器

vector容器 动态数组 可变数组 vector容器 单口容器 vector实现动态增长&#xff1a; 当插入新元素时&#xff0c;如果空间不足&#xff0c;那么vector会重新申请更大内存空间&#xff08;默认二倍&#xff09;&#xff0c;将原空间数据拷贝到新空间&#xff0c;释放旧空…

函数返回值失效

#include<stdio.h> #include<stdlib.h> #include<string.h> #if 1 char* getMen2() {char buf[64]; //临时变量&#xff0c;栈区存放strcpy(buf, "abccddeeff");printf("buf:%s\n", buf);return buf; //此处并不是把内存块64个字节ret…

mysql突然出现慢sql_Mysql开启慢SQL并分析原因

第一步.开启mysql慢查询方式一:修改配置文件Windows&#xff1a;Windows 的配置文件为 my.ini&#xff0c;一般在 MySQL 的安装目录下或者 c:\Windows 下。Linux&#xff1a;Linux 的配置文件为 my.cnf &#xff0c;一般在 /etc 下在 my.ini 增加几行:[mysqlld]long_query_time…

STL10-deque容器

deque 双端队列 deque 删除操作 deque案例&#xff1a; #if 1 #include<iostream> #include<deque> using namespace std; void PrintDeque(deque<int>& d) {for (deque<int>::iterator it d.begin(); it ! d.end(); it) {cout << *it <…

STL11-stack容器

#if 1 #include<iostream> #include<stack> using namespace std;void test01() {//初始化stack<int> s1;stack<int> s2(s1);//stack操作s1.push(10);s1.push(20);s1.push(30);s1.push(40);cout << "栈顶元素&#xff1a;" << e…