0
点赞
收藏
分享

微信扫一扫

C++ ---->_模板_

各位好友, 欢迎来到本期博客 !下面, 正式进入 ---->模板环节 ---->STL最后一块拼图

不知大家, 是否还记得 C++ 是为了弥补 与改善 C 语言上的不足 !同样, 模板 引入了一种新的体验 !

下面, 程序是按照 C 语言上的用法习惯, 使用的一种交换数据类型的算法 !非常冗余 ! 如下所示 :>

------>测试环节 :>

C++ ---->_模板__总结


------>调试环节 :>

C++ ---->_模板__总结_02

可见,上述写法, 重复了许多 相同代码,而下面, 模板的引入, 是真的非常香 !如下所示 :>

----->模板 ~~ 开启 :>

#include <iostream>

using std::cout;
using std::endl;

template<typename T>
void Swap(T& left, T& right)
{
	T tmp = left;
  left = right;
  right = tmp;
}

int main()
{
	int a = 10, b = 12;
  Swap(a, b);
  
  double m = 21.5, n = 23,5;
  Swap(m, n);
  
  char ch1 = 'a', ch2 = 'g';
  Swap(ch1, ch2);
}

----->更好观感的彩色代码 :>

C++ ---->_模板__函数模板_03


------>调试环节 :>

C++ ---->_模板__模板_04

各位好友, 在这里 还要提及一下, 泛型编程 !何为 泛型编程?

---->编写 与类型无关的通用代码, 是代码复用的一种手段。 模板是泛型编程的基础。

而模板 分为两大块 :>函数模板, 类模板

C++ ---->_模板__总结_05

有关上述代码, 用模板实现,还需要注意 :>typename 是用来定义模板参数关键字, 也可以使用 class 

但是不可以使用 struct 进行定义 !

另外, 还需明确一点:>函数模板是一个蓝图, 它本身并不是函数, 是编译器生产特定具体类型函数的模具。

----->函数模板实例化:>

---->用不同类型的参数使用函数模板, 称为函数模板的实例化。

模板实例化分为两大部分 :>隐式实例化 与显示实例化。

(1)隐式实例化 :>让编译器根据实参 --->推演模板参数的实际类型。

----->实现环节 :>

#include <iostream>
using std::cout;
using std::endl;

template <typename T>

T Add(T& left, T&right)
{
	return left + right;
}

int main()
{
	int a = 10, b = 12;
  Add(a, b);
  
  double m = 23.5, n = 27.5;
  Add(m, n);
}

----->更好观感的彩色代码 :>

C++ ---->_模板__总结_06

------>调试环节:>

---'>着 反汇编 :>

C++ ---->_模板__new / delete 用法_07


C++ ---->_模板__总结_08

(2)显示实例化 :>在函数名之后 <>里面 指定模板参数的实际类型。

在(1)中 运用模板, 实现环节, 会发现传入的实参类型是相同的 !那若不同呢, 会有什么情况:>

----->错误示范 :>

C++ ---->_模板__new / delete 用法_09


----->正确样例 :>

C++ ---->_模板__new / delete 用法_10


----->解析 :>


C++ ---->_模板__模板_11


各位好友,请注意,上述红色框框, 这是使用显示实例化, 非常关键的一点 !

在前几期, 曾提及过 权限 , 这在 “引用” 一档期 !着重梳理的 !而在这里, 同样涉及到权限


---->如下所示 :>

C++ ---->_模板__类 模板_12

----->类_模板_

---->未 运用模板 ——>实现栈区 :>

C++ ---->_模板__函数模板_13


------->测试运行结果 :>

C++ ---->_模板__函数模板_14

各位好友, 以上是 没有运用模板, 栈区实现 !但是, 这只能实现 一种类型的算法 !

若 想继续实现 “字符型栈区”,“浮点型栈区”···· 必须再次书写上述同样的代码, 之后更换一下类型而已😊

这样子, 不仅仅造成时间成本巨大, 而且也不方便维护 !一旦某一个环节出现差池, 修改起来, 会相当繁琐 !

接下来, 继续推进, 运用模板, 实现不同类型的数据栈区 !

---->运用模板 ——>实现栈区 :>

#include <iostream>
using std::cout;
using std::endl;

template <typename T>

class Stack
{
public:
  Stack(int Capacity = 3)
  {
  	_array = new T[Capacity];
    
    _capacity = Capacity;
    _top = 0;
  }
  ~Stack()
  {
  	delete[]_array;
    _array = nullptr;
    _capacity = 0;
    _top = 0;
  }
  void Push(T x)
  {
  	_array[_top++] = x;
  }
  void Pop()
  {
  	_top--;
  }
  T TTop()
  {
  	return _array[_top - 1];
  }
  bool Empty()
  {
  	return _top == 0;
  }
private:
  T* _array;
  int _top;
  int _capacity;
};

int main()
{
  Stack<int>s1;
  s1.Push(21);
  s1.Push(24);
  s1.Push(23);
  while(!s1.Empty())
  {
  	printf("%d ", s1.TTop());
    s1.Pop();
  }
  printf("\n");
	return 0;
}

---->实现环节 :>

C++ ---->_模板__类 模板_15


----->测试环节 与运行结果 :>

C++ ---->_模板__类 模板_16


各位好友, 上述 运用模板 实现不同类型的数据栈区 !请注意, 只要修改一下, 模板参数 即可 !

另外, 还需明确一点, 类 都需要 显示实例化 !至此, 模板 算是告一段落了 !下面, 转战 new 用法 !

由于上面使用了 new 来开辟新空间, 因此, 下面开战 new / delete 用法 !

---->主打点 :>new / delete ---->自定义类型

----->源码_01 :>

#include <iostream>
using std::cout;
using std::endl;

class A
{
public:
  A(int a = 10)
    :_a(a)
  {
      cout << "A() 构造 :>" << this << endl;
  }
  ~A()
  {
  	cout << "~A() 析构  :>" << this << endl;
  }
private:
  int _a;
};

int main()
{
  A* ptr1 = (A*)malloc(sizeof(A));
  A* ptr2 = new A(1);			// 可以进行初始化为 1
  
  free(ptr1);	
  delete ptr2;						// 注意 :>匹配 搭配 !
	return 0;
}

----->更好观感的彩色代码 :>

C++ ---->_模板__类 模板_17

----->源码_02 :>

#include <iostream>
using std::cout;
using std::endl;

class A
{
public:
  A(int a = 10)
    :_a(a)
  {
      cout << "A() 构造 :>" << this << endl;
  }
  ~A()
  {
  	cout << "~A() 析构  :>" << this << endl;
  }
private:
  int _a;
};

int main()
{
  A* _ptr1 = (A*)malloc(sizeof(A) * 6);
  A* _ptr2 = new A[6];		// 此处, 会去调用 六次构造函数
  
  free(_ptr1);	
  delete _ptr2;						// 注意 :>匹配 搭配 !
	return 0;
}

----->更好观感的彩色代码 :>

C++ ---->_模板__函数模板_18

各位好友, 现 对上述,new / delete 进行总结 :>

----->图解环节 :>

C++ ---->_模板__类 模板_19

至此, 本章节告一段落 !模板 --->STL 最后一块拼图 !下一期, STL 燃烧 --->即将开启

------>剑指 STL ---->string

------>期待 下一期再相会 !😊😊


举报

相关推荐

模板c++

C++(模板)

c++ 模板

c++模板

[c++]模板

C++ - 模板

C++ 模板

【C++】模板

0 条评论