得之我幸 失之我命

when someone abandons you,it is him that gets loss because he lost someone who truly loves him but you just lost one who doesn’t love you.

Cpp 令人迷惑的概念

在 C++ 中有好几个术语,它们有两个词组成,交换顺序后意思就变了,而在使用过程中,常常可能因为对它们的混淆导致误人子弟

这几组术语分别是:

  1. 函数指针 vs 指针函数
  2. 数组指针 vs 指针数组
  3. 类模板 vs 模板类
  4. 函数模板 vs 模板函数

可以明确的是,上述几个术语中,重心在后面,前面的词是作为形容词使用的

函数指针 vs 指针函数

  • 函数指针的重点是指针。表示的是一个指针,它指向的是一个函数

    例子:

    1
    int (*pf)();
  • 指针函数的重点是函数。表示的是一个函数,它的返回值是指针

    例子:

    1
    int* fun();

数组指针 vs 指针数组

  • 数组指针的重点是指针。表示的是一个指针,它指向的是一个数组

    例子:

    1
    int (*pa)[8];
  • 指针数组的重点是数组。表示的是一个数组,它包含的元素是指针

    例子:

    1
    int* ap[8];

类模板 vs 模板类(class template vs template class)

  • 类模板的重点是模板。表示的是一个专门用于产生类的模板

    例子:

    1
    2
    3
    4
    5
    6
    7
    template <typename T>
    class Vector
    {
    // code here
    };

    //使用这个 Vector 模板就可以产生很多的 class(类),Vector <int> 、Vector <char> 、Vector <Vector <int>> 、Vector <Shape*> ……
  • 模板类的重点是类。表示的是由一个模板生成而来的类

    例子:

    上面的 Vector <int> 、Vector <char> …… 全是模板类

函数模板 vs 模板函数(function template vs template function)

  • 函数模板的重点是模板。表示的是一个专门用来生产函数的模板

    例子:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    template <typename T>
    void fun(T a)
    {
    //code here
    }

    //or
    //template <class T>
    //void fun(T a)
    //{
    //code here
    //}
    //其中,template 是声明一个模板,typename 是声明一个虚类型 T,这个 T 可以代替 int、double 等基本数据类型,那为什么还有 class?因为最初是用 class 声明一个 T 来表示通用数据类型,但考虑到 class 会和 "类" 混淆,就改用 typename 进行定义,同时保留了 class,这两者效果相同

    //在运用的时候,可以显式(explicitly)生产模板函数,fun <int> 、fun <double> 、fun <Shape*> …… 也可以在使用的过程中由编译器进行模板参数推导,帮你隐式(implicitly)生成

    fun(6); //隐式生成 fun <int>

    fun(8.9); //隐式生成 fun <double>

    fun('a'); //隐式生成 fun <char>

    Shape* ps = new Cirlcle;
    fun(ps); // 隐式生成 fun <Shape*>
  • 模板函数的重点是函数。表示的是由一个模板生成而来的函数

    例子:

    上面显式(explicitly)或者隐式(implicitly)生成的 fun <int> 、fun <Shape*> …… 都是模板函数

be yourself, everyone else is already taken.