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++提高编程的主要内容,如果未能解决你的问题,请参考以下文章

c语言和c++有啥关系

前辈指点:我想提高自己的java编程水平,想练一下ACM,可ACM中是不是很多题只能用C或是C++才能实现

怎么提高C++编程的基本功?这才是硬实力

arduino 开发用啥编程语言

c++是 ??

现在软件开发,一般都用啥语言啊?