C++知识总结--重载与模板

1. 默认参数
要为某个参数设置默认值,则必须为它右边所有参数提供默认值

int harpo(int n, int m = 0, int j = 5)        /* VALID */
int chico(int n, int m = 6, int j)            /* INVALID */
int groucho(int k = 0, int m = 2, int n = 3)    /* VALID */

 

2. 函数重载
函数的参数列表,也称为函数的特征标。
是特征标,而不是函数返回类型使得可以对函数进行重载。
p.s. 编译器在检查函数特征标时,把类型引用和类型本身视作同一个特征标。
仅当函数基本上执行相同的任务,但使用不同形式的数据时,才应采用函数重载。

 

3. 函数模板:

template <class Any>     /* 也可以写成  template <typename Any>  */
void Swap(Any &a, Any &b) {
    Any temp;
    temp = a; a = b; b = temp;
}

 

程序示例:

#include <iostream>

template <typename Any> void Swap(Any &a, Any &b); /* 声明 */ int main() { using namespace std; int i = 10; int j = 20; Swap(i, j); cout<<"After swap, i = "<<i<<", j = "<<j<<endl; return 0; } template <typename Any> void Swap(Any &a, Any &b) { Any temp; temp = a; a = b; b = temp; }

 

4. 重载的模板:

template <class Any>     /* 也可以写成  template <typename Any>  */
void Swap(Any &a, Any &b) {
    Any temp;
    temp = a; a = b; b = temp;
}

template <class Any>     /* 也可以写成  template <typename Any>  */
void Swap(Any a[], Any b[], int n) {
    Any temp;
    for (int i = 0; i < n; i++) {
        temp = a[i]; a[i] = b[i]; b[i] = temp;
    }
}

 

  4.1 显示具体化(explicit specialization)
  以template<>开头,并通过名称来指出类型
  e.g.
  struct job {
    char name[20];
    double salary;
    int floor;
  };
  template<> void Swap<job> (job& a, job &b)
  或者可以写成更简单的形式:template<> void Swap(job &a, job &b)

  如果有多个原型,编译器在选择原型时,非模板化版本 > 显示具体化 > 模板版本
  // non-template function prototype
  void Swap(job &, job &)

  // template prototype
  template<typename Any>
  void Swap(Any &, Any &)

  // explicit specialization for the job type
  template<> void Swap(job &, job &)

  4.2 显示实例化(explicit instantiation)
  template void Swap<int> (int, int) (显示具体化声明在template<> 后)
  编译器看到上述声明后,将使用Swap()模板生成一个使用int类型的实例。

 

5. using声明 using std::cout;
using编译命令 using namespace std;

namespace Jill {
    double bucket(double n) {...}
    double fetch;
    struct Hill {...};
}
char fetch;
int main() {
    using namespace Jill;
    Hill Thrill;            /* using Jill::Hill */
    double water = bucket(2);     /* using Jill::bucket */
    double fetch;            /* hide Jill::fetch */    
    cin >> fetch;            /* local fetch */
    cin >> ::fetch;            /* global fetch */
    cin >> Jill::fetch;        /* Jill::fetch */
  
   return 0; }

 

posted @ 2015-06-12 13:00  xiaokuang  阅读(167)  评论(0编辑  收藏  举报