C++ 일반 프로그래밍, 함수 템플릿 및 클래스 템플릿

1. 일반 프로그래밍

일반 프로그래밍: 유형에 독립적인 일반 코드를 작성하는 것은 코드 재사용의 수단입니다. 템플릿은 일반 프로그래밍의 기초입니다.

예를 들어, 활자인쇄는 틀을 제공하고 그 틀에 따라 다양한 문자를 인쇄하는 방식이다.

일반 프로그래밍은 유사한 패턴을 따르며 컴파일러가 자동으로 다양한 함수나 클래스를 생성하는 데 기반이 되는 템플릿을 제공합니다.

2. 기능 템플릿

2.1 함수 템플릿이 있는 이유는 무엇입니까?

C 언어에서 두 개의 정수를 교환하거나, 두 개의 부동 소수점 숫자를 교환하거나, 사용자 정의 유형을 교환하려면 수동으로 n 함수를 직접 작성해야 합니다! ! ! 그리고 함수마다 함수명이 다릅니다! ! !

void SwapInt(int& a,int& b)
{
	int c = a;
	a = b;
	b = c;
}
void SwapDouble(double& a, double& b)
{
	double c = a;
	a = b;
	b = c;
}

int main()
{
	int a1 = 1, b1 = 2;
	SwapInt(a1, b1);
	cout << a1 << " " << b1 << endl;
	double a2 = 1.1, b2 = 2.2;
	SwapDouble(a2, b2);
	cout << a2 << " " << b2 << endl;
	return 0;
}

여러 함수를 작성하는 대신 하나의 함수(템플릿)만 작성하여 다양한 타입의 교환을 완료할 수 있는 방법이 없을까요? 이때 함수 ​​템플릿이 무대에 등장합니다.

2.2 기능 템플릿 사용 방법

템플릿 형식:

템플릿<클래스 T1, 클래스 T2, 클래스 T3...>

반환값 함수명(함수 매개변수) { 함수 본문 }

template<class T>
void Swap(T &a ,T &b)
{
	T c = a;
	a = b;
	b = c;
}
int main()
{
	int a1 = 1, b1 = 2;
	Swap(a1, b1);
	cout << a1 << " " << b1 << endl;
	double a2 = 1.1, b2 = 2.2;
	Swap(a2, b2);
	cout << a2 << " " << b2 << endl;
	return 0;
}

2.3 함수 템플릿의 인스턴스화

여기서 제공하는 스왑은 실제 함수가 아닌 함수 템플릿일 뿐입니다.다른 유형의 매개변수와 함께 함수 템플릿을 사용하는 경우, < /span>라고 합니다! ! ! 함수 템플릿 인스턴스화 컴파일러는 해당 함수를 자동으로 생성해야 하며, 이를

템플릿 인스턴스화는명시적 인스턴스화암시적 인스턴스화로 구분됩니다.

2.3.1 암시적 인스턴스화

컴파일러는 실제 매개변수 유형을 식별하고 템플릿 매개변수의 유형을 추론합니다.

template<class T>
void Swap(T &a ,T &b)
{
	T c = a;
	a = b;
	b = c;
}
int main()
{
	int a1 = 1, b1 = 2;
	Swap(a1, b1);

	double a2 = 1.1, b2 = 2.2;
	Swap(a2, b2);
	return 0;
}

T의 유형은 전달된 매개변수에서 추론됩니다. 이를 암시적 인스턴스화라고 합니다.

2.3.2 디스플레이 인스턴스화

함수 이름 뒤의 <>에 전달된 특정 유형을 지정하세요.

template<class T>
void Swap(T &a ,T &b)
{
	T c = a;
	a = b;
	b = c;
}
int main()
{
	int a1 = 1, b1 = 2;
	Swap<int>(a1, b1);

	double a2 = 1.1, b2 = 2.2;
	Swap<double>(a2, b2);
	return 0;
}

3. 클래스 템플릿

3.1 클래스 템플릿이 필요한 이유는 무엇입니까?

두 개의 스택이 필요한 경우(한 스택은 int 유형을 저장하고 다른 하나는 double 유형을 저장함) 우리는 두 개의 서로 다른 클래스만 작성할 수 있습니다. 이 두 클래스는 클래스 이름이 다르지만 유형을 제외하고 클래스의 다른 모든 것은 동일합니다. !!!

class StackInt
{
public:
	StackInt(int capacity = 4)
	{
		_a = new int[capacity];
		_top = 0;
		_capacity = capacity;
	}
	~StackInt()
	{
		delete[] _a;
		_a = nullptr;
		_top = _capacity = 0;
	}
private:
	int* _a;
	int _top;
	int _capacity;
};
class StackDouble
{
public:
	StackDouble(int capacity = 4)
	{
		_a = new double[capacity];
		_top = 0;
		_capacity = capacity;
	}
	~StackDouble()
	{
		delete[] _a;
		_a = nullptr;
		_top = _capacity = 0;
	}
private:
	double* _a;
	int _top;
	int _capacity;
};

int main()
{
	StackInt st1;
	StackDouble st2;
	return 0;
}

이때 이 문제를 해결하려면 클래스 템플릿을 사용해야 합니다.

3.2 클래스 템플릿을 사용하는 방법

템플릿 형식:

템플릿<클래스 T1, 클래스 T2, 클래스 T3...>

class 클래스 이름 { 멤버 함수 및 멤버 변수 };

template<class T>
class Stack
{
public:
	Stack(int capacity = 4)
	{
		_a = new T[capacity];
		_top = 0;
		_capacity = capacity;
	}
	~Stack()
	{
		delete[] _a;
		_a = nullptr;
		_top = _capacity = 0;
	}
private:
	T* _a;
	int _top;
	int _capacity;
};


int main()
{
	Stack<int> st1;
	Stack<double> st2;
	return 0;
}

3.3 클래스 템플릿의 인스턴스화

클래스 템플릿의 인스턴스화는 함수 템플릿의 인스턴스화와 다르며, 클래스 템플릿의 인스턴스화는 <>에 클래스 이름과 인스턴스화 유형 뒤에 <>를 추가하는 것입니다. 클래스 템플릿 이름은 실제 클래스가 아니지만 인스턴스화 결과는 실제 클래스입니다 .

스택은 클래스 이름입니다.

Stack

Supongo que te gusta

Origin blog.csdn.net/qq_73955920/article/details/134675884
Recomendado
Clasificación