2024年大数据最全全面总结C++类模板使用的基础知识_c++模板怎么用,2024年最新oppo大数据开发面试题

2024年大数据最全全面总结C++类模板使用的基础知识_c++模板怎么用,2024年最新oppo大数据开发面试题既有适合小白学习的零基础资料 也有适合 3 年以上经验的小伙伴深入学习提升的进阶课程 涵盖了 95 以上大数据知识点 真正体系化 由于文件比较多 这里只是将部分目录截图出来 全套包含大厂面经 学习笔记 源码讲义 实战项目 大纲路线 讲解视频 并且后续会持续更新

大家好,我是讯享网,很高兴认识大家。

img
讯享网
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上大数据知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

需要这份系统化资料的朋友,可以戳这里获取

代码演示:

template<class T1,class T2=int> class Per { public: T1 name; T2 height; Per(T1 name, T2 height) { this->name = name; this->height = height; } void showInfo() { cout << "姓名:" << name << " 身高:" << height << endl; } }; //1、指定传入类型 void printInfo(Per<string, int>& p) { p.showInfo(); } //2、参数模板化 template<class T1,class T2> void printInfo1(Per<T1, T2>& p) { p.showInfo(); cout << "T1的类型为:" << typeid(T1).name() << endl; cout << "T2的类型为:" << typeid(T2).name() << endl; } //3、整个类模板化 template<class t> void printInfo2(t & p) { p.showInfo(); cout << "t的类型为:" << typeid(t).name() << endl; } void test04() { Per<string> p("叶落秋白", 183); printInfo(p); } void test4() { Per<string> p("微凉秋意", 184); printInfo1(p); } void test4a() { Per<string>p("落叶归根",185); printInfo2(p); } 

讯享网

小结:第一种指定传入类型的方式最为常用,查看自动推导类型可以调用typeid(虚拟类型).name()函数。其实string类型原名特别长,调用typeid函数的时候可以查看,另外也可以直接查看整个类模板化时虚拟类型t的数据类型。

运行效果:

类模板与继承

类模板的继承不同于普通类的继承。这是因为类模板的属性数据类型事先并未指定,所以子类无法分配内存空间。

要点:

代码示例:

讯享网template<class T> class Base { public: Base() { cout << "此时父类T的数据类型是:" << typeid(T).name() << endl; } T m; }; //class Son :public Base<int>//这里可以直接指定,不过为了灵活指定,将子类变为类模板 //子类变成类模板 template<class T1,class T2> class Son :public Base<T2> { public: T1 n; Son() { cout << "T1的数据类型为:" << typeid(T1).name()<< endl; cout << "T2的数据类型为:" << typeid(T2).name()<< endl; } }; void test05() { Son<int,char> s; } 

将子类变为类模板的时候可以自由添加子类的属性,这里子类Son的属性是T1类型的n,当然继承的T2属性的m也存在。在继承的时候将T2作为父类的虚拟类型,那么创建子类对象的时候指定的数据类型char就会先传给T2,T2再传给父类的T,那么就完成了灵活指定继承数据类型的工作

创建子类对象是会自动调用父类构造,那么就能调用事先设置好的typeid函数来查看由子类指定的父类的虚拟数据类型的具体类型。

运行效果:

类模板成员函数的类外实现

成员函数类外实现需要在加作用域的前提下再加类模板的参数列表

代码演示:

template<class T1, class T2> class Person { public: T1 name; T2 height; Person(T1 name, T2 height);//构造函数声明 void showInfo();//showInfo函数声明 }; //构造函数类外实现 template<class T1,class T2> Person<T1,T2>::Person(T1 name, T2 height) { this->height = height; this->name = name; } template<class t1, class t2> void Person<t1,t2>::showInfo() { cout << "姓名:" << name << " 身高:" << height << endl; } //成员函数类外实现 void test06() { Person<string, int> p("叶落秋白",184); p.showInfo(); } 

虽然在加作用域的前提下加了类模板的参数列表,但是编译器并不认识那些虚拟类型,所以还需要在其上面紧跟着加上template关键字来声明虚拟类型。

类模板的分文件编写

问题所在:
由于类模板成员函数在调用时才创建,只包含头文件,再函数调用时会出现无法解析的命令
解决方案:
 1、包含源文件(.cpp)不常用
 2、常将头文件和源文件写进一个文件里,文件后缀名改为.hpp,约定的格式

示例:

讯享网//person.hpp文件内容 #pragma once #include<iostream> using namespace std; template<class T1, class T2> class Person { public: T1 name; T2 height; Person(T1 name, T2 height); void showInfo(); }; //构造函数类外实现 template<class T1, class T2> Person<T1, T2>::Person(T1 name, T2 height) { this->height = height; this->name = name; } template<class t1, class t2> void Person<t1, t2>::showInfo() { cout << "姓名:" << name << " 身高:" << height << endl; } //调用的文件内容 #include"person.hpp" void test07() { Person<string, int> p("叶落秋白", 184); p.showInfo(); } 

将头文件声明和源文件实现全部写在一个头文件里并将头文件名改为.hpp就能解决类模板的分文件编写出现的问题了。

类模板和友元

特点:

代码讲解:

//全局函数设置在类外时需要做的工作 template<class T1, class T2> class Student; template<class T1, class T2> void showInfo1(Student<T1, T2>p) { cout << "姓名:" << p.name << " 年龄:" << p.age << endl; } //类模板Student template<class T1, class T2> class Student { //1、全局函数设置在类内 friend void showInfo(Student p) { cout << "姓名:" << p.name << " 年龄:" << p.age << endl; } //2、全局函数设置在类外 friend void showInfo1<>(Student s); private: T1 name; T2 age; public: Student(T1 name, T2 age) { this->age = age; this->name = name; } }; void test08() { Student<string, int> s1("叶落秋白", 18); Student<string, int> s2("微凉秋意", 20); showInfo(s1); showInfo1(s2); } 

首先我创建类模板Student将name 和 age 属性进行封装,我们知道通过friend可以将函数设置为友元函数,即可以访问类的私有属性。全局函数内部实现比较简单,直接在函数前面加上friend关键字即可。

全局函数的外部实现稍微复杂点:

首先将函数的声明写在类上方并在前面加上friend关键字,然后在类外完成该友元函数的实现。要特别注意:类外实现的时候需要加上template关键字声明虚拟类型,那么此时声明的部分也要加上空列表才行,要不然声明和实现不对应;而且类模板函数只有在调用时才会创建,所以需要把具体实现写在类上方,这样编译器才会创建这个函数;那么当你把实现写在最上面时,参数列表需要指定类型,那么就需要再把类模板的声明写在该实现上方。只有完成这些工作之后,才可以实现友元函数的类外实现。

运行效果:

总结

关于类的内容还是挺多的,类变成模板之后形式上也出现了或多或少的变化。想熟练掌握唯一的方法就是多记多练了,建议收藏反复观看。

img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上大数据知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

需要这份系统化资料的朋友,可以戳这里获取

[外链图片转存中…(img-v0h8goFB-91)]
[外链图片转存中…(img-u5KGNaCd-91)]
[外链图片转存中…(img-N0fkcEur-92)]

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上大数据知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

需要这份系统化资料的朋友,可以戳这里获取

小讯
上一篇 2025-02-19 14:25
下一篇 2025-02-19 19:44

相关推荐

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/50375.html