c++入门学习日志:初阶 模板

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介: c++入门学习日志:初阶 模板

模板就好像一个模子,我们知道古时候会用到各种各样的模子来制作东西,而这种模子就好像是我们的模板一样。模板是模板和它所产生的类或者函数是不一样的,我们产生的类或者函数用的可不是模板  模板分为:函数模板 和 类模板


函数模板代表了一个函数家族,该函数模板与类型无关,在使用时被参数化,根据实参类型产生函数的特定类型

template <class T>//class可以用typename替代,但是不能使用struct。后面只能跟一个函数
void swap(T& p, T& q)
{
  T tmp = p;
  p = q;
  q = tmp;
}
int main()
{
    int a=1,b=2;
    swap(a,b);
}


 这个就是一个函数模板的典型案例,我们调用它时,调用的函数模板产生的函数,不是模板的本身。函数模板的类型一般是编译器根据实参传给形参推演出来的,但是有的时候还是需要我们自己去显示实例化的,比如:test<int>(10);


模板参数也是可以给缺省参数的哦

template <class T = int>
void swap(T& p, T& q)
{
  T tmp = p;
  p = q;
  q = tmp;
}
int main()
{
    int a=1,b=2;
    swap(a,b);
}


模板也是可以声明和定义分离的,但不支持把他们放到两个文件里面,这样会出现链接错误,因为那些放在.c文件的定义,链接是找不到这些函数模板调用的地址(毕竟你不知道这个模板里面的T的类型,编译器自然就不会把这一部分写进符号表里面),除非你去显示实例化指定:

1. template;
2. void swap<int>(int& p,int& q);


template <class T>
void swap(T& p, T& q);
template <class T>
void swap(T& p, T& q)
{
  T tmp = p;
  p = q;
  q = tmp;
}
template <class T>//模板参数可以有多个
class date
{
public:
  date(int a = 1);
private:
  int _hour;
  int* _a;
};
template <class T>
date<T>::date(int a)
{
  _hour = a;
  _a = new T[10];
}

大家觉得这样的代码对嘛:

template <class T>
void swap(T& p, T& q)
{
  T tmp = p;
  p = q;
  q = tmp;
}
int main()
{
    int a = 1;
    double b = 2.0;
    swap(a,b);
}

这样肯定是不行的,编译器在判断T的时候就会矛盾,不知道这里的T应该是int还是double那可以怎么解决呢?

1. swap<int>(a,b);
2. swap<double>(a,b);

其实可以向我们上面这样显示实例化,实际上模板类也是要自己显示实例化才能使用的,除非你自己写的有缺省参数


如果现在有一个函数,还有一个函数模板,模板除了参数是模板参数以外其他都和我们得函数相同,大家觉得这个函数和这个函数模板可以同时存在嘛?存在时调用又是先用哪一个呢


这两个肯定是可以同时存在的,他们完全两种不同的东西,调用的时候自然也是调用我们已经写好的函数,编译器也会图方便去调用更便捷那个 

相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
目录
相关文章
|
15天前
|
XML 安全 Java
【日志框架整合】Slf4j、Log4j、Log4j2、Logback配置模板
本文介绍了Java日志框架的基本概念和使用方法,重点讨论了SLF4J、Log4j、Logback和Log4j2之间的关系及其性能对比。SLF4J作为一个日志抽象层,允许开发者使用统一的日志接口,而Log4j、Logback和Log4j2则是具体的日志实现框架。Log4j2在性能上优于Logback,推荐在新项目中使用。文章还详细说明了如何在Spring Boot项目中配置Log4j2和Logback,以及如何使用Lombok简化日志记录。最后,提供了一些日志配置的最佳实践,包括滚动日志、统一日志格式和提高日志性能的方法。
131 30
【日志框架整合】Slf4j、Log4j、Log4j2、Logback配置模板
|
26天前
|
编译器 C语言 C++
配置C++的学习环境
【10月更文挑战第18天】如果想要学习C++语言,那就需要配置必要的环境和相关的软件,才可以帮助自己更好的掌握语法知识。 一、本地环境设置 如果您想要设置 C++ 语言环境,您需要确保电脑上有以下两款可用的软件,文本编辑器和 C++ 编译器。 二、文本编辑器 通过编辑器创建的文件通常称为源文件,源文件包含程序源代码。 C++ 程序的源文件通常使用扩展名 .cpp、.cp 或 .c。 在开始编程之前,请确保您有一个文本编辑器,且有足够的经验来编写一个计算机程序,然后把它保存在一个文件中,编译并执行它。 Visual Studio Code:虽然它是一个通用的文本编辑器,但它有很多插
|
1月前
|
编译器 C++
C++入门12——详解多态1
C++入门12——详解多态1
38 2
C++入门12——详解多态1
|
1月前
|
编译器 程序员 C++
【C++打怪之路Lv7】-- 模板初阶
【C++打怪之路Lv7】-- 模板初阶
16 1
|
1月前
|
C++
C++入门13——详解多态2
C++入门13——详解多态2
79 1
|
1月前
|
存储 安全 编译器
【C++打怪之路Lv1】-- 入门二级
【C++打怪之路Lv1】-- 入门二级
23 0
|
1月前
|
自然语言处理 编译器 C语言
【C++打怪之路Lv1】-- C++开篇(入门)
【C++打怪之路Lv1】-- C++开篇(入门)
26 0
|
1月前
|
分布式计算 Java 编译器
【C++入门(下)】—— 我与C++的不解之缘(二)
【C++入门(下)】—— 我与C++的不解之缘(二)
|
1月前
|
编译器 Linux C语言
【C++入门(上)】—— 我与C++的不解之缘(一)
【C++入门(上)】—— 我与C++的不解之缘(一)
|
1月前
|
编译器 C++
C++入门11——详解C++继承(菱形继承与虚拟继承)-2
C++入门11——详解C++继承(菱形继承与虚拟继承)-2
30 0
下一篇
无影云桌面