C++类模板

2

C++类模板

  前天介绍了C++中函数模板的相关知识,函数模板非常简单,使用也很方便,C++中还给我们提供了类模板的相关知识,但是相比较而言,类模板就非常复杂,知识点很多,也并不经常使用,小伙伴作为了解即可。

类模板

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#include<iostream>
using namespace std;

//类模板:建立一个通用类,类的成员数据类型不具体指定,定义方式和函数模板相同。
//区别在于类模板没有自动类型推导,使用时必须指定类型。函数模板中的默认参数没有意义,类模板中默认参数有意义。
//类模板和普通类的区别在于:类模板中的成员函数并不是创建类时创建,而是调用时创建,而普通类中的成员函数是在创建类时创建。
template <class TName, class TAge=int>
class Person
{
public:
TName tName;
TAge tAge;
Person(TName tName, TAge tAge) {
this->tName = tName;
this->tAge = tAge;
}

void print() {
cout << "我的名字是:" << this->tName << ",我的年龄是:" << this->tAge << endl;
}
};

int main() {

Person<string> p1("C++程序员", 30);
p1.print();

return 0;
}

1

类模板作为函数参数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
#include<iostream>
using namespace std;

template <class TName, class TAge=int>
class Person
{
public:
TName tName;
TAge tAge;
Person(TName tName, TAge tAge) {
this->tName = tName;
this->tAge = tAge;
}

void print() {
cout << "我的名字是:" << this->tName << ",我的年龄是:" << this->tAge << endl;
}
};

//指定传入类型
void test1(Person<string> &p) {
p.print();
}

//参数模板化
template<class T>
void test2(Person<T> &p) {
p.print();
}

//整体模板化
template<class P>
void test3(P &p) {
p.print();
}

int main() {
Person<string> p1("C++程序员", 30);
test1(p1);

Person<string> p2("Java程序员", 26);
test2(p2);

Person<string> p3("Python程序员", 22);
test3(p3);

return 0;
}

2

子类继承类模板

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
#include<iostream>
using namespace std;

template <class TName, class TAge=int>
class Person
{
public:
TName tName;
TAge tAge;
Person(TName tName, TAge tAge) {
this->tName = tName;
this->tAge = tAge;
}

void print() {
cout << "我的名字是:" << this->tName << ",我的年龄是:" << this->tAge << endl;
}
};

//子类继承类模板有两种方式,第一种是指定父类的类型
class Teacher : public Person<string> {
public:
Teacher(string s, int age):Person(s, age){}
};

//第二种是灵活继承,子类也变成类模板。
template <class TName, class TAge=int>
class Student : public Person<TName> {
public:
Student(TName tName, TAge tAge):Person<TName> (tName, tAge) {}
};

int main() {

Teacher t("C++老师", 45);
t.print();

Student<string> s("C++学生", 30);
s.print();

return 0;
}

4

C++小结

  类模板相对于函数模板较为复杂,模板元编程不推荐大家使用,对于本来就是菜鸡的小伙伴们,这无疑又强行增加难度,我们学习C++的高级编程主要关注点在于STL库和面向对象与设计模式之间的关系,因此后面介绍的内容,小伙伴们一定要认真学习。

-------------本文结束感谢您的阅读-------------
0%