STL基础知识
1、 C++的标准化过程始于1989年,于1997年底完成,最终标准与1998年9月公布
2、 C++语言核心和C++程序库是同时被标准化的。
3、 STL完全依赖模板Template
4、 模板的参数可以显示或隐式传递
5、 函数模板
6、 类模板:有能力操控任意类型元素的容器
7、 模板的编译问题
8、 模板的参数通常为类型,但也可以为非类型,如某个类型的实例
9、 模板参数也可以有缺省的参数
10、 typename关键字的使用
l 代替class关键字
l 声明类型
template <typename T>
class MyClass
{
typename T::SubType* ptr;
//…
};
typename指出SubType 是T Class中定义的一种类型,即ptr是指向T::SubType类型的一个指针,如果不写typename,编译器就理解T::SubType* ptr为T类的静态成员SubType和ptr之乘。
11、 类的成员函数也可以为模板,称为成员模板
如:
class MyClass
{
//…
template<typename T>
void f(T){/*…*/}
//…
};
一个重要的用途:提供自动类型转换
如:
template<typename T>
class MyClass
{
private:
T value;
public:
void assign(const MyClass<T>& x)
{value=x.value;}
};
//..
void f()
{
MyClass<double> d;
MyClass<double> i;
d.assign(d);//ok
d.assign(i);//error!
}
将assign函数修改成成员模板就可以了
template<typename T>
class MyClass
{
private:
T value;
public:
template<typename X>
void assign(const MyClass<X>& x)
{value=x.GetValue();}
T GetValue()
{return value;}
};
我们可以称此函数为Template Constructor:常用于复制对象时实现隐式类型转换。Template Constructor并不隐藏显式的拷贝构造函数,如果类型完全吻合则使用显式的拷贝构造函数。
12、 Nested Class嵌套的模板类
13、 基本数据类型的初始化
int i1;
int i2=int();
在模板中常使用
如:
template <typename T>
void f()
{
T x=T();
}
14、 Namespace:命名空间是将不同的标识符号集合在一个具有名字的作用域内。命名空间是开放的,你可以在不同的模块中定义和扩展命名空间。
使用时有两种方法:使用using declaration ;使用using directive ,使用它后会使命名空间的所有名字暴光。
C++标准程序库STL在namespace std中定义了它所用的标识符号
15、 explicit关键字:通过使用explicit关键字我们可以禁止“单参数构造函数”用户自动类型转换。
如:
class Stack
{
public:
explicit Stack(int Size)
{
//…
}
//…
};
//…
Stack x;
x=40;//error
如果不用explicit修饰的话会生成有40个元素的空Stack对象并赋值给x
explicit关键字也阻绝以赋值语法进行带有转型操作的初始化
Stack s(40);
Stack s1=20;
16、 类型转换
static_cast:代替常见的类型转换;dynamic_cast:用于向下类型转换;