C++初步之核心编程篇三:命名空间与模板
一、命名空间(namespace)
1. 概述
命名空间,可作为附加信息来区分不同库中相同名称的函数、类、变量等。使用了命名空间即定义了上下文。本质上,命名空间就是定义了一个范围。
在标准命名空间中存在很多函数,如std::cin,std::cout,std::sort()…,通常情况下,在代码中加入
using namespace std
后,就可以省略函数前面的std::,它的意思是在std(标准命名空间)中调用函数,使用上述语句后,默认使用标准命名空间,所以可以省略。
2. 使用
-
自定义命名空间
#include <iostream> using namespace std; // 命名空间1 namespace space_1{ void func(){ cout << "namespace_1" << endl; } } // 命名空间2 namespace space_2{ void func(){ cout << "namespace_2" << endl; } } int main () { // 调用命名空间1中的函数 space_1::func(); // 调用命名空间2中的函数 space_2::func(); return 0; }
-
using指令的使用
//为了使用特定命名空间的函数或者变量,需要加上命名空间的名称,以简化函数和变量的形式 //如上例中,调用函数需要: 命名空间::函数,这里的::可以理解为领域,下面是使用using指令的例子 #include <iostream> using namespace std;//方便使用cout函数 // 命名空间1 namespace space_1{ void func(){ cout << "namespace_1" << endl; } } // 命名空间2 namespace space_2{ void func(){ cout << "namespace_2" << endl; } } using namespace space_1; int main () { func(); // 调用命名空间1中的函数 return 0; }
-
嵌套命名空间
namespace space_1 { // 代码声明 namespace space_2 { // 代码声明,例如 void func() { cout << "This is space_1 :: space_2 :: func()\n"; } } }
直接调用
space_1::space_2::func();
二、C++模板(template)
1. 函数
-
形式:
template <typename T> function_name(parameter list)//parameter list:形参列表 { // 函数的主体 }
-
例子:
//这是一个返回最大值的函数模板,支持两个同类型的数字进行比较 template <typename T> inline T const& Max (T const& a, T const& b) { return a < b ? b:a; }
2. 类
注意:c++模板类成员的声明和定义应该都放在.h中!*
-
形式:
template <class T> class class_name { //... }
-
例子:
template <class T> class Stack { private: vector<T> elems; // 元素 public: void push(T const&); // 入栈 void pop(); // 出栈 T top() const; // 返回栈顶元素 bool empty() const{ // 如果为空则返回真。 return elems.empty(); } }; template <class T> void Stack<T>::push (T const& elem) { // 追加传入元素的副本 elems.push_back(elem); } template <class T> void Stack<T>::pop () { if (elems.empty()) { throw out_of_range("Stack<>::pop(): empty stack"); } // 删除最后一个元素 elems.pop_back(); } template <class T> T Stack<T>::top () const { if (elems.empty()) { throw out_of_range("Stack<>::top(): empty stack"); } // 返回最后一个元素的副本 return elems.back(); }
THE END…