C+(1),字节跳动java校招面试题

T MyPlus(T a, T b){

T ret = a + b;

return ret;

}

//普通函数

int MyPlus(int a, int b){

int ret = a + b;

return ret;

}

void test03(){

int a = 10;

int b = 20;

char c = ‘a’;

char d = ‘b’;

//如果函数模板和普通函数都能匹配,c++编译器优先考虑普通函数

cout << MyPlus(a, b) << endl;

//如果我必须要调用函数模板,那么怎么办?

cout << MyPlus<>(a, b) << endl;

//此时普通函数也可以匹配,因为普通函数可以自动类型转换

//但是此时函数模板能够有更好的匹配

//如果函数模板可以产生一个更好的匹配,那么选择模板

cout << MyPlus(c,d);

}

//函数模板重载

template

T MyPlus(T a, T b, T c){

T ret = a + b + c;

return ret;

}

void test04(){

int a = 10;

int b = 20;

int c = 30;

cout << MyPlus(a, b, c) << endl;

//如果函数模板和普通函数都能匹配,c++编译器优先考虑普通函数

}

五、模板机制剖析


思考:为什么函数模板可以和普通函数放在一起?c++编译器是如何实现函数模板机制的?

1.编译过程

在这里插入图片描述

2.模板实现机制

在这里插入图片描述

六、模板的局限性


在这里插入图片描述

class Person

{

public:

Person(string name, int age)

{

this->mName = name;

this->mAge = age;

}

string mName;

int mAge;

};

//普通交换函数

template

void mySwap(T &a,T &b)

{

T temp = a;

a = b;

b = temp;

}

//第三代具体化,显示具体化的原型和定意思以template<>开头,并通过名称来指出类型

//具体化优先于常规模板

template<>void mySwap(Person &p1, Person &p2)

{

string nameTemp;

int ageTemp;

nameTemp = p1.mName;

p1.mName = p2.mName;

p2.mName = nameTemp;

ageTemp = p1.mAge;

p1.mAge = p2.mAge;

p2.mAge = ageTemp;

}

void test()

{

Person P1(“Tom”, 10);

Person P2(“Jerry”, 20);

cout << "P1 Name = " << P1.mName << " P1 Age = " << P1.mAge << endl;

cout << "P2 Name = " << P2.mName << " P2 Age = " << P2.mAge << endl;

mySwap(P1, P2);

cout << "P1 Name = " << P1.mName << " P1 Age = " << P1.mAge << endl;

cout << "P2 Name = " << P2.mName << " P2 Age = " << P2.mAge << endl;

}

七、类模板


1.类模板基本概念

在这里插入图片描述

template<class NameType, class AgeType>

class 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); // 类模板不能进行类型自动推导

Person<string, int>P1(“德玛西亚”, 18);

P1.showPerson();

}

2.类模板做函数参数

//类模板

template<class NameType, class AgeType>

class 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<string,int>& p){

p.mAge += 20;

p.mName += “_vip”;

p.PrintPerson();

}

int main(){

Person<string, int> p(“John”, 30);

DoBussiness§;

system(“pause”);

return EXIT_SUCCESS;

}

3.类模板派生普通类

//类模板

template

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

};

4.类模板派生类模板

//父类类模板

template

class Base

{

T m;

};

template

class Child2 : public Base //继承类模板的时候,必须要确定基类的大小

{

public:

T mParam;

};

void test02()

{

Child2 d2;

}

5.类模板类内实现

template<class NameType, class AgeType>

class 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); // 类模板不能进行类型自动推导

Person<string, int>P1(“德玛西亚”, 18);

P1.showPerson();

}

6.类模板类外实现

#define _CRT_SECURE_NO_WARNINGS

#include

#include

using namespace std;

template<class T1, class T2>

class Person{

public:

Person(T1 name, T2 age);

void showPerson();

public:

T1 mName;

T2 mAge;

};

//类外实现

template<class T1, class T2>

Person<T1, T2>::Person(T1 name, T2 age){

this->mName = name;

this->mAge = age;

}

template<class T1, class T2>

void Person<T1, T2>::showPerson(){

cout << “Name:” << this->mName << " Age:" << this->mAge << endl;

}

void test()

{

Person<string, int> p(“Obama”, 20);

p.showPerson();

}

int main(){

test();

system(“pause”);

return EXIT_SUCCESS;

}

7.类模板头文件和源文件分离问题

Person.hpp

#pragma once

template<class T1,class T2>

class Person{

public:

Person(T1 name,T2 age);

void ShowPerson();

public:

T1 mName;

T2 mAge;

};

template<class T1, class T2>

Person<T1, T2>::Person(T1 name, T2 age){

this->mName = name;

this->mAge = age;

}

template<class T1, class T2>

void Person<T1, T2>::ShowPerson(){

cout << “Name:” << this->mName << " Age:" << this->mAge << endl;

}

main.cpp

#define _CRT_SECURE_NO_WARNINGS

#include

using namespace std;

#include

#include"Person.hpp"

//模板二次编译

//编译器编译源码 逐个编译单元编译的

int main(){

Person<string, int> p(“Obama”, 20);

p.ShowPerson();

小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数初中级Java工程师,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年最新Java开发全套学习资料》送给大家,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
img
img
img

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频

如果你觉得这些内容对你有帮助,可以添加下面V无偿领取!(备注Java)
img

cpp

#define _CRT_SECURE_NO_WARNINGS

#include

using namespace std;

#include

#include"Person.hpp"

//模板二次编译

//编译器编译源码 逐个编译单元编译的

int main(){

Person<string, int> p(“Obama”, 20);

p.ShowPerson();

小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数初中级Java工程师,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年最新Java开发全套学习资料》送给大家,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
[外链图片转存中…(img-19TVbAuX-1710780854240)]
[外链图片转存中…(img-8Yhj8E4X-1710780854241)]
[外链图片转存中…(img-QTgqKOIj-1710780854241)]

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频

如果你觉得这些内容对你有帮助,可以添加下面V无偿领取!(备注Java)
[外链图片转存中…(img-v5uPfbFX-1710780854242)]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值