最新要闻
- 陕西招聘会现3万月薪岗位学生排长龙 招聘人员:半天收简历150份
- 当前动态:供不应求!真我GT Neo5 1TB版真香:二手用户也抢着要
- “山药成了精”?男子买到奇葩山药外形酷似人脚掌
- 美少女三消游戏 《Mirror 2: Project X》开发组宣布破产解散
- 酒店回应到211大学招服务员:符合流程 面向所有高校毕业生
- 快看点丨京东CEO徐雷:百亿补贴效果超过预期、要做天天低价
- 【新要闻】比亚迪加入降价大军!宋Pro DM-i限时优惠:88元折扣6888元
- 焦点简讯:耳机煲机一般要煲多久_耳机煲机方法是什么?买回来新耳机要怎样煲?耳机要煲多久?
- 全球速看:浙四医院官网招聘2021_浙四医院官网
- 环球观点:京东2022年收入超1万亿:“百亿补贴”会一直有!
- 简约时尚 健身备一件:361°新款轻薄速干衣39元冲量
- 越来越卖不动了!最畅销十款数码相机一览:索尼成赢家 第一性价比绝
- 全球通讯!Intel的大小核CPU架构:最终还是把一些老游戏坑了
- 往返近1000元!景区回应坐滑竿上山按斤收费:网友力挺明码标价
- 前沿资讯!海洋风筝爆火 一周暴涨498%超过秋裤!网友:春天的信号
- 天天消息!甜香丝滑 旺旺邦德低脂轻乳咖啡官方狂促:合2元一瓶
广告
手机
iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
- 警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- 男子被关545天申国赔:获赔18万多 驳回精神抚慰金
- 3天内26名本土感染者,辽宁确诊人数已超安徽
- 广西柳州一男子因纠纷杀害三人后自首
- 洱海坠机4名机组人员被批准为烈士 数千干部群众悼念
家电
世界热议:62.类模板
1.类模板
1.1类模板基本概念
函数模板,实际上是建立一个通用函数,其函数类型和形参类型不具体制定,用一个虚拟的类型来代表。这个通用函数就成为函数模板
●类模板用于实现类所需数据的类型参数化
templateclass Person{public:Person(NameType name, AgeType age){this->mName = name;this->mAge = age;}void showPerson(){cout << "name: " << this->mName << " age: " << this->mAge << endl;}public:NameType mName;AgeType mAge;};void test01(){//Person P1("德玛西亚",18); // 类模板不能进行类型自动推导 PersonP1("德玛西亚", 18);P1.showPerson();}
1.2类模板做函数参数
//类模板templateclass Person{public:Person(NameType name, AgeType age){this->mName = name;this->mAge = age;}void PrintPerson(){cout << "Name:" << this->mName << " Age:" << this->mAge << endl;}public:NameType mName;AgeType mAge;};//类模板做函数参数void DoBussiness(Person& p){p.mAge += 20;p.mName += "_vip";p.PrintPerson();}int main(){Person p("John", 30);DoBussiness(p);system("pause");return EXIT_SUCCESS;}
#define _CRT_SECURE_NO_WARNINGS#includeusing namespace std;#include//普通类继承类模版templateclass Father{public:Father(){m = 20;}public:T m;};//普通类 继承 类模版class Son :public Father//要告诉编译器父类的泛型数据类型具体是什么类型{public:};//类模版 继承 类模版templateclass Son2 :public Father//要告诉编译器父类的泛型数据类型具体是什么类型{};void test(){Son2 s;cout << s.m << endl;}int main(){test();system("pause");return EXIT_SUCCESS;}
3.类模板派生普通类
#pragma warning(disable:4996)#define _CRT_SECURE_NO_WARNINGS 1#include #include using namespace std;//类模板templateclass MyClass {public:MyClass(T property) {this->mProperty = property;}public:T mProperty;};//子类实例化的时候需要具体化的父类,子类需要知道父类的具体类型是什么样的//这样c++编译器才能知道给子类分配多少内存//普通派生类class SubClass : public MyClass {public:SubClass(int b) : MyClass(20) {this->mB = b;}public:int mB;};int main(){SubClass son(1);cout << "son.mProperty:" << son.mProperty << "," << "son.mB:" << son.mB << endl; system("pause"); return EXIT_SUCCESS;}
输出:
(资料图片仅供参考)
son.mProperty:20,son.mB:1请按任意键继续. . .
1.4模板派生类模板
//父类类模板templateclass Base{T m;};templateclass Child2 : public Base //继承类模板的时候,必须要确定基类的大小{public:T mParam;};void test02(){Child2 d2;}
1.5类模板类内实现
templateclass Person{public:Person(NameType name, AgeType age){this->mName = name;this->mAge = age;}void showPerson(){cout << "name: " << this->mName << " age: " << this->mAge << endl;}public:NameType mName;AgeType mAge;};void test01(){//Person P1("德玛西亚",18); // 类模板不能进行类型自动推导 PersonP1("德玛西亚", 18);P1.showPerson();}
#define _CRT_SECURE_NO_WARNINGS#includeusing namespace std;#includetemplateclass Maker{public:Maker(NameType name, AgeType age);/*{this->name = name;this->age = age;}*/void printMaker();/*{cout << "Name:" << this->name << " Age:" << this->age << endl;}*/public:NameType name;AgeType age;};//类模版的成员函数类外实现//要写成函数模版templateMaker::Maker(NameType name, AgeType age){cout << "构造函数" << endl;this->name = name;this->age = age;}templatevoid Maker::printMaker(){cout << "Name:" << this->name << " Age:" << this->age << endl;}int main(){Maker m("haha", 20);m.printMaker();system("pause");return EXIT_SUCCESS;}
1.6类模板类外实现
#define _CRT_SECURE_NO_WARNINGS#include#includeusing namespace std;templateclass Person{public:Person(T1 name, T2 age);void showPerson();public:T1 mName;T2 mAge;};//类外实现templatePerson::Person(T1 name, T2 age){this->mName = name;this->mAge = age;}templatevoid Person::showPerson(){cout << "Name:" << this->mName << " Age:" << this->mAge << endl;}void test(){Person p("Obama", 20);p.showPerson();}int main(){test();system("pause");return EXIT_SUCCESS;}
1.7类模板头文件和源文件分离问题
Person.hpp
#pragma oncetemplateclass Person{public:Person(T1 name,T2 age);void ShowPerson();public:T1 mName;T2 mAge;};templatePerson::Person(T1 name, T2 age){this->mName = name;this->mAge = age;}templatevoid Person::ShowPerson(){cout << "Name:" << this->mName << " Age:" << this->mAge << endl;}
main.cpp
#define _CRT_SECURE_NO_WARNINGS#includeusing namespace std;#include#include"Person.hpp"//模板二次编译//编译器编译源码 逐个编译单元编译的int main(){Person p("Obama", 20);p.ShowPerson();system("pause");return EXIT_SUCCESS;}
结论:案例代码在qt编译器顺利通过编译并执行,但是在Linux和vs编辑器下如果只包含头文件,那么会报错链接错误,需要包含cpp文件,但是如果类模板中有友元类,那么编译失败!
解决方案: 类模板的声明和实现放到一个文件中,我们把这个文件命名为.hpp(这个是个约定的规则,并不是标准,必须这么写).
原因:
●类模板需要二次编译,在出现模板的地方编译一次,在调用模板的地方再次编译。
●C++编译规则为独立编译
1.8模板类碰到友元函数
#define _CRT_SECURE_NO_WARNINGS#includeusing namespace std;#include template class Person;//告诉编译器这个函数模板是存在template void PrintPerson2(Person& p);//友元函数在类内实现templateclass Person{//1. 友元函数在类内实现friend void PrintPerson(Person& p){cout << "Name:" << p.mName << " Age:" << p.mAge << endl;}//2.友元函数类外实现//告诉编译器这个函数模板是存在friend void PrintPerson2<>(Person& p);//3. 类模板碰到友元函数模板templatefriend void PrintPerson(Person& p);public:Person(T1 name, T2 age){this->mName = name;this->mAge = age;}void showPerson(){cout << "Name:" << this->mName << " Age:" << this->mAge << endl;}private:T1 mName;T2 mAge;};void test01(){Person p("Jerry", 20);PrintPerson(p);}// 类模板碰到友元函数//友元函数类外实现 加上<>空参数列表,告诉编译去匹配函数模板templatevoid PrintPerson2(Person& p){cout << "Name2:" << p.mName << " Age2:" << p.mAge << endl;}void test02(){Person p("Jerry", 20);PrintPerson2(p); //不写可以编译通过,写了之后,会找PrintPerson2的普通函数调用,因为写了普通函数PrintPerson2的声明}int main(){//test01();test02();system("pause");return EXIT_SUCCESS;}
#define _CRT_SECURE_NO_WARNINGS#includeusing namespace std;#includetemplateclass Maker{friend void printMaker(Maker &p){cout << "类内实现" << p.name << " " << p.age << endl;}public:Maker(NameType name, AgeType age){this->name = name;this->age = age;}private:NameType name;AgeType age;};void test01(){Maker m("悟空", 18);printMaker(m);}templateclass Maker2;//告诉编译器下面有printMaker2的实现templatevoid printMaker2(Maker2 &p);templateclass Maker2{//1.在函数名和()之间加上<>。(使得可以去找函数模板)friend void printMaker2<>(Maker2 &p);//2.编译器不知道printMaker2下面有没有实现,需要知道函数的结构public:Maker2(NameType name, AgeType age){this->name = name;this->age = age;}private:NameType name;AgeType age;};//友元在类外实现要写成函数模版templatevoid printMaker2(Maker2 &p){cout << "类外实现的友元函数 " << p.name << " " << p.age << endl;}void test02(){Maker2 m("贝吉塔", 18);printMaker2(m);}int main(){test02();system("pause");return EXIT_SUCCESS;}
2.类模板的应用
设计一个数组模板类(MyArray),完成对不同类型元素的管理
类模版实现数组.cpp
#define _CRT_SECURE_NO_WARNINGS#includeusing namespace std;#include"MyArray.hpp"#includeclass Maker{public:Maker(){}Maker(string name, int age){this->name = name;this->age = age;}public:string name;int age;};void printMaker(MyArray &arr){for (int i = 0; i < arr.getSize(); i++){cout << "姓名:" << arr[i].name << " 年龄:" << arr[i].age << endl;}}void test(){MyArray myarr(4);Maker m1("悟空", 18);Maker m2("贝吉塔", 30);Maker m3("短笛", 200);Maker m4("小林", 19);myarr.Push_Back(m1);myarr.Push_Back(m2);myarr.Push_Back(m3);myarr.Push_Back(m4);printMaker(myarr);MyArray myint(10);for (int i = 0; i < 10; i++){myint.Push_Back(i + 1);}for (int i = 0; i < 10; i++){cout << myint[i] <<" ";}cout << endl;}int main(){test();system("pause");return EXIT_SUCCESS;}
MyArray.hpp
#pragma oncetemplateclass MyArray{public:MyArray(int capacity){this->mCapacity = capacity;this->mSize = 0;//T如果是Maker,这里要调用什么构造函数,要调用无参构造p = new T[this->mCapacity];}//拷贝构造MyArray(const MyArray &arr){this->mCapacity = arr.mCapacity;this->mSize = arr.mSize;p = new T[arr.mCapacity];for (int i = 0; i < this->mSize; i++){p[i] = arr.p[i];}}//赋值函数MyArray &operator=(const MyArray &arr){if (this->p != NULL){delete[] this->p;this->p = NULL;}p = new T[arr.mCapacity];this->mSize = arr.mSize;this->mCapacity = arr.mCapacity;for (int i = 0; i < this->mSize; i++){p[i] = arr.p[i];}return *this;}//重载[]T &operator[](int index){return this->p[index];}//尾插void Push_Back(const T &val){if (this->mSize == this->mCapacity){return;}this->p[this->mSize] = val;this->mSize++;}//尾删void Pop_Back(){if (this->mSize == 0){return;}this->mSize--;}~MyArray(){if (this->p != NULL){delete[] p;p = NULL;}}int getSize(){return this->mSize;}private:T *p;int mCapacity;int mSize;};
关键词:
初识rollup 打包、配置vue脚手架
世界热议:62.类模板
当前热文:C语言——可变参函数
陕西招聘会现3万月薪岗位学生排长龙 招聘人员:半天收简历150份
当前动态:供不应求!真我GT Neo5 1TB版真香:二手用户也抢着要
“山药成了精”?男子买到奇葩山药外形酷似人脚掌
每日视点!快速读懂Redis分布式锁的实现和原理
美少女三消游戏 《Mirror 2: Project X》开发组宣布破产解散
酒店回应到211大学招服务员:符合流程 面向所有高校毕业生
快看点丨京东CEO徐雷:百亿补贴效果超过预期、要做天天低价
【新要闻】比亚迪加入降价大军!宋Pro DM-i限时优惠:88元折扣6888元
焦点简讯:耳机煲机一般要煲多久_耳机煲机方法是什么?买回来新耳机要怎样煲?耳机要煲多久?
世界热点评!前端如何相对优雅管理api
全球速看:浙四医院官网招聘2021_浙四医院官网
环球观点:京东2022年收入超1万亿:“百亿补贴”会一直有!
简约时尚 健身备一件:361°新款轻薄速干衣39元冲量
越来越卖不动了!最畅销十款数码相机一览:索尼成赢家 第一性价比绝
全球通讯!Intel的大小核CPU架构:最终还是把一些老游戏坑了
往返近1000元!景区回应坐滑竿上山按斤收费:网友力挺明码标价
天天实时:【翻译】发布 .NET 8 Preview 1
前沿资讯!海洋风筝爆火 一周暴涨498%超过秋裤!网友:春天的信号
天天消息!甜香丝滑 旺旺邦德低脂轻乳咖啡官方狂促:合2元一瓶
《银河护卫队3》导演回击网友言论:确定选角不因其是黑人
世界热议:东风系引发车市价格大战!纯电宝马i3终端大促销:最大降幅超10万
每日热点:日本原药温和驱蚊配方:超威电热蚊香液3瓶1器14.9元发车
快讯:uni-popup 遮不住头部标题的解决办法
环球焦点!网友晒空荡新房 各大品牌疯狂随份子 开局一套房其他全靠送
快播:女子在地铁上脱鞋抠脚死皮掉一地 杭州地铁回应:列车到站会打扫
世界速递!为拯救者Y9000P 2023量身打造:联想推出新140W氮化镓适配器
每日看点!富士康否认清退临时工拆除流水线:运转正常
全球即时:美国一特斯拉撞上消防车造成一死一伤 现场惨烈!调查结果让人心痛
Envisics获得5000万美元C轮融资
当前滚动:(数据库系统概论|王珊)第十一章并发控制-第二、三、四节:封锁、封锁协议活锁和死锁
每日焦点!「中华田园敏捷开发」,是老板无能还是程序员无力?
【世界聚看点】探究SMC局部代码加密技术以及在CTF中的运用
记录--Vue自定义指令实现加载中效果v-load(不使用Vue.extend)
【焦点热闻】十分钟读懂火山引擎 DataLeap 数据治理实践
老头环壶头哥:击败女武神超4千次 期待DLC到来
天天资讯:儿子沉迷手机爸爸帮请假“逼”他连玩17小时:效果很好
焦点消息!供应iPhone 15的OLED屏幕漏光?国产面板一哥京东方回应:不予评价
当前关注:纵享丝滑 回味愉悦:德芙巧克力37.5元/斤(官价5折)
每日速看!成龙进组20天把半年的封闭用完了!新电影《龙马精神》4月上映:有吴京参演
每日视点!通过案例讲解python循环语句
【全球独家】基于应用理解的协议栈优化
关注:串口登录提示"Login incorrect"
热推荐:节能降耗 | AIRIOT智慧电力综合管理解决方案
实时:C++笔记--函数、预处理
【天天播资讯】为啥人一上车就爱睡觉?原来是被“催眠”了
全球观察:95后大厂女生裸辞开麻将馆当保洁:很享受自由和成就感
全球今日报丨2030年前后我国将实施火星采样返回:难度很大
【全球播资讯】特斯拉中国2月销量出炉 比亚迪能打5个特斯拉
航班晚点 山航机长提速帮乘客5分钟极限转机:提前20分钟到达
速递!首钢股份:2月重点产品产量同比均提升 预计国内钢材价格短期震荡偏强
焦点播报:Python常见面试题012. 可迭代对象和迭代器有啥区别?
从5分钟到60秒,袋鼠云数栈在热重启技术上的提效探索之路
世界观天下!我的脑内恋碍选项第二季会出吗_我的脑内恋碍选项第二季
【天天报资讯】ChatGPT火出圈!人工智能工程师平均招聘月薪突破2.5万
环球热文:三星推出冰淇淋主题键鼠套装:薄荷配色如此清凉
集成ChatGPT威力显著:微软Bing日活跃首次破亿
每日快报!3月罕见!郑州今日冲上30°C高温:成北方首个30℃+省会级城市
世界球精选!RTX 50显卡有望使用 GDDR7显存验证方案来了:狂飙36Gbps
无界生态发布会即将举办 焕新后的星纪魅族将带来哪些惊喜?
java代码审计-XSS
全球今日讯!vue中将base64流数据转成pdf文件可打印
环球速讯:1 MySql基础介绍
世界观焦点:英媒:多特蒙德中场贝林厄姆将决定自己的未来
观察:今年五一档已定档10部新片 王一博《长空之王》超65万人想看
天天热讯:海上巨无霸 我国自主研制的全球最大集装箱船今天交付
全球讯息:日本H3火箭首秀失败初步调查结果公布:电源系统异常
重获新“声”!清华开发出可穿戴人工喉咙:还原准确率超90%
天天热点评!美国一邮轮300多人患病呕吐腹泻:疑似感染诺如病毒
React Hooks源码深度解析
当前热文:虹科分享 | B站崩了怎么办?Redis企业版数据库多云战略分析
每日速读!Math.atan2求角度解析
快速打包、发布和管理应用——AppUploader工具介绍
星纪魅族集团宣布成立 全面推行新战略,新理念
热资讯!说唱女歌手转行卖烧烤年入百万 直言:梦想和生活不矛盾
全球观察:索尼α7 IV发布2.00版本固件:增加Creators' App支持
全风化和强风化哪个硬?全风化和强风化的区别是什么?
牛转乾坤是什么意思?牛转乾坤放在家里哪个位置?
离不开你是哪部电视剧主题曲?离不开你的原唱是谁?
惊艳世俗的名字有哪些?惊艳世俗的小说句子有哪些?
卧铺有充电的地方吗?卧铺补票怎么补怎么收费?
每日关注!C++笔记--数组、函数、预处理
索爱mk16i支持通话录音吗?索爱mk16i拍照效果怎么样?
双胡须造型着实罕见!腾势N7申报:首款激光雷达比亚迪来了
网易3A级赛车手游《巅峰极速》今日首测 全球超百款跑车正版授权
汽车和小孩被劫 定位要先续流量费!大众汽车宣布重大决定
讯息:股价涨停 中国上市公司永鼎回应美国室温超导技术:目前不可行
当前看点!财运好的男人手相 什么手相最有财运
IM通讯协议专题学习(六):手把手教你如何在Android上从零使用Protobuf
GO语言学习笔记-方法篇 Study for Go ! Chapter five - Method
每日看点!面试被问到了解哪些开发模型?看这一篇就够了!
热键是什么意思?热键冲突怎么解决?
微信怎么群发消息?微信怎么分组管理好友?
环球微资讯!绝无系统广告!蔚来手机真机曝光:神似索尼
每日看点!比亚迪F品牌越野SUV谍照曝光:对标奔驰大G 价格40万起
每天少睡一两个小时算熬夜?专家提醒:大脑会变笨
A4车主免费变成“A5”车主?奥迪做出重大决定
委员建议在农村淘汰老头乐!推广更好的新能源汽车