C++提高编程
Posted 明天变强一点就好
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++提高编程相关的知识,希望对你有一定的参考价值。
C++提高编程
1.模板
1.1模板的概念
- 模板就是建立通用的摸具,大大提高复用性
- 模板的特点
- 模板不可以直接使用,它只是一个框架
- 模板的通用并不是万能的
1.2函数模板
- C++中另一种编程思想称为泛型编程,主要利用的技术就是模板
- C++提供两种模板机制:函数模板和类模板
1.2.1函数模板语法
-
函数模板作用
- 建立一个通用函数,其函数返回值类型和形参类型可以不具体定制,用一个虚拟的类型来代表
-
语法
template<typename T>
函数声明或定义
- 解释
- template — 声明创建模板
- typename — 表面起后面的符号是一种数据类型,可以用class替代
- T — 通用的数据类型加粗样式,名称可以替换,通常为大写字母
#include<iostream>
using namespace std;
//函数模板
template<typename T> //声明一个模板,告诉编译器后面代码紧跟的T不要报错,T是一个通用类型
void mySwap(T& a, T& b)
T temp = a;
a = b;
b = temp;
void test1()
// 两种方式使用函数模板
// 1.自动类型推导
int a = 20;
int b = 40;
mySwap(a, b);
cout << "a = " << a << endl; // 40
cout << "b = " << b << endl; // 20
// 2.显示指定类型
mySwap<int>(a, b);
cout << "a = " << a << endl; // 20
cout << "b = " << b << endl; // 40
int main()
test1();
system("pause");
return 0;
1.2.2函数模板注意事项
- 注意事项
- 自动类型推导,必须推导出一致的数据类型T,才可以使用
- 模板必须要确定出T的数据类型,才可以使用
#include<iostream>
using namespace std;
template<typename T>
void mySwap(T &a,T &b)
T temp = a;
a = b;
b = temp;
//模板必须要确定出T的数据类型,才可以使用
template<typename T>
void func()
cout << "func的调用" << endl;
void test1()
int a = 10;
int b = 30;
char c = 'a';
mySwap(a, b);
// mySwap(a, c); // error,推导不出不一致的T类型
cout << "a = " << a << endl;
cout << "b = " << b << endl;
void test2()
func<int>();
int main()
//test1();
test2();
system("pause");
return 0;
1.2.3函数模板案例
#include<iostream>
using namespace std;
template<typename T>
void mySwap(T &a,T &b)
T temp = a;
a = b;
b = temp;
template<typename T>
void arrSort(T arr[],int len)
for (int i = 0;i < len;i++)
int max = i;
for (int j = i + 1;j < len;j++)
if (arr[max] < arr[j])
max = j;
if(max != i)
mySwap(arr[max], arr[i]);
template<typename T>
void showArr(T arr[], int len)
for (int i = 0;i < len;i++)
cout << arr[i] << " ";
cout << endl;
void test1()
char arr[] = "abefcej";
arrSort<char>(arr, sizeof(arr) / sizeof(char));
showArr(arr, sizeof(arr) / sizeof(char));
int main()
test1();
system("pause");
return 0;
1.2.4普通函数与函数模板的区别
- 区别
- 普通函数调用时可以发生自动类型转换(隐式类型转换)
- 函数模板调用时,如果利用自动类型推导,不会发生隐式类型转换
- 如果利用显示指定类型的方式,可以发生隐式类型转换
#include<iostream>
using namespace std;
//函数模板
template<typename T>
T myAdd2(T a, T b)
return a + b;
// 普通函数
int myAdd(int a, int b)
return a + b;
void test1()
int a = 12;
int b = 13;
char c = 's';
cout << myAdd(a, b) << endl;// 25
// 隐藏类型转化
cout << myAdd(a, c) << endl;// 127
cout << myAdd2(a, b) << endl;// 25
// 自动类型推导 -- 不能自动转换(隐式转换)
//cout << myAdd2(a, c) << endl;// error
//显示指定类型
cout << myAdd2<int>(a, c) << endl;// 127
int main()
test1();
system("pause");
return 0;
总结: 建议使用显示指定类型的方式,调用函数模板,自己可以确定通用类型
1.2.5普通函数与函数模板的调用规则
- 调用规则
- 如果函数模板和普通函数都可以实现,优先调用普通函数
- 可以通过空模板参数列表来强制调用函数模板
- 函数模板也可以发生重载
- 如果函数模板可以产生更好的匹配,优先调用函数模板
#include<iostream>
using namespace std;
void myPrint(int a,int b)
cout << "调用普通函数" << endl;
template <typename T>
void myPrint(T a, T b)
cout << "调用函数模板" << endl;
template <typename T>
void myPrint(T a, T b,T c)
cout << "调用函数模板的重载" << endl;
void test1()
int a = 10;
int b = 20;
//函数模板和普通函数都可以调用,优先调用普通函数
//普通函数只有函数声明,调用会报错
myPrint(a, b);
//空模板参数列表,强制调用函数模板
myPrint<>(a, b);
//函数模板可以发生重载
myPrint(a, b, 20);
//函数模板产生更好的匹配,优先调用函数模板
char a1 = 'a';
char b1 = 'b';
myPrint(a1, b1);// 调用函数模板
int main()
test1();
system("pause");
return 0;
1.2.6模板的局限性
- 局限性
- 模板的通用性并不是万能的
- 利用具体化的模板,可以解决自定义类型的通用化
#include<iostream>
using namespace std;
#include<string>
class Person
public:
Person(string name,int age)
this->m_Name = name;
this->m_Age = age;
string m_Name;
int m_Age;
;
template<typename T>
bool myCompare(T& a, T& b)
if (a == b)
return true;
else
return false;
// 利用具体化Person的版本实现代码,具体优先调用
template<> bool myCompare(Person& p1, Person& p2)
if (p1.m_Name == p2.m_Name && p1.m_Age == p2.m_Age)
return true;
else
return false;
void test1()
int a = 10;
int b = 20;
bool res = myCompare(a, b);
if (res)
cout << "a==b" << endl;
else
cout << "a != b" << endl;
void test2()
Person person1("Jack", 20);
Person person2("Jack", 20);
bool res = myCompare(person1, person2);
if (res)
cout << "person1 == person2" << endl;
else
cout << "person1 != person2" << endl;
int main()
//test1();
test2();
system("pause");
return 0;
1.3类模板
1.3.1类模板语法
-
类模板的作用
- 建立一个通用类,类中的成员 数据类型 可以不具体规定,用一个虚拟的类型来代表
-
语法
template<class T> 类
- template — 声明创建模板
- class — 表明其后免得符号是一种数据类型,可以用 typename 代替
- T — 通用的数据类型,名称可以替换,通常为大写字幕
#include<iostream>
using namespace std;
#include<string>
//类模板
template<class NameType,class AgeType>
class Person
public:
Person(NameType name,AgeType age)
this->m_Name = name;
this->m_Age = age;
void showPerson()
cout << "name:" << this->m_Name << ",age:" << this->m_Age << endl;
NameType m_Name;
AgeType m_Age;
;
void test1()
Person<string, int> p1("类模板", 20);
p1.showPerson();
int main()
test1();
system("pause");
return 0;
1.3.2类模板和函数模板区别
- 类模板和函数模板的区别
- 类模板没有自动类型推导的使用方式
- 类模板在模板参数列表中可以有默认参数
#include<iostream>
using namespace std;
//类模板和函数模板的区别
//类模板在参数列表中可以有默认参数 AgeType = int
template<class NameType,class AgeType = int>
class Person
public:
Person(NameType name,AgeType age)
this->m_Name = name;
this->m_Age = age;
void showPerson()
cout << "name:" << this->m_Name << ",age:" << this->m_Age << endl;
NameType m_Name;
AgeType m_Age;
;
void test1()
// 类模板没有自动化类型推导使用方式
//Person p("数字化", 10);
Person<string, int> p("数字化", 10);
p.showPerson();
void test2()
Person<string> p("智能化", 10);
p.showPerson();
int main()
//test1();
test2();
system("pause");
return 0;
1.3.3类模板中成员函数创建时机
- 类模板中成员函数和普通类中成员函数创建时机是有区别的
- 普通类中成员函数一开始就可以创建
- 类模板中成员函数在调用时才创建
#include<iostream>
using namespace std;
class Person1
public:
void showPerson1()
cout << "Person1 show" << endl;
;
class Person2
public:
void showPerson2()
cout << "Person2 show" << endl;
;
template<class T>
class MyClass
public:
T obj;
//类模板的成员函数
void fun1()
obj.showPerson1();
void fun2()
obj.showPerson2();
;
void test1()
MyClass<Person1> m;
m.fun1();
// 类模板中成员函数在调用时创建
// m.fun2();
int main()
system("pause");
return 0;
1.3.4类模板对象做函数参数
- 类模板实例化出的对象,向函数传参的方式
- 指定传入的类型 — 直接显示对象的数据类型 (推荐)
- 参数模板化 — 将对象中的参数变为模板进行传递
- 整个类模板化 — 将这个对象类型 模板化 进行传递
#include<iostream>
using namespace std;
template<class T,class K>
class Person
public:
Person(T name, K age)
this->m_Name = name;
this->m_Age =以上是关于C++提高编程的主要内容,如果未能解决你的问题,请参考以下文章