欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

《STL源码剖析》学习笔记

程序员文章站 2022-03-23 11:28:54
...

1、placement new

new(p) T1(value);

以上代码中,p是一个指针,T1为一个类,value用于初始化这个类。以上代码的作用是,在p所指向的内存区域上新建一个类T1的对象,用value初始化该对象。在这个过程中,p所指向的内存区域的内容改变了,并且p指向了新参数的对象。

2、explicit关键字

class CxString  // 没有使用explicit关键字的类声明, 即默认为隐式声明  
{  
public:  
    char *_pstr;  
    int _size;  
    CxString(int size)  
    {  
        _size = size;                // string的预设大小  
        _pstr = malloc(size + 1);    // 分配string的内存  
        memset(_pstr, 0, size + 1);  
    } 
};  
  
// 下面是调用:  
CxString string2 = 10;    // 这样是OK的, 为CxString预分配10字节的大小的内存  

类的构造函数如果只有一个参数的话,那么在编译的时候就会有一个缺省的转换操作:将该构造函数对应数据类型的数据转换为该类对象,如上面最后一行代码所示。而explicit关键字可以防止这种隐式转换,如果在第六行前面加上explicit关键字,最后一行就会报错。explicit关键字只对有一个参数的类构造函数有效, 如果类构造函数参数大于或等于两个时, 是不会产生隐式转换的, 所以explicit关键字也就无效了。

3、模板特化和偏特化

在定义模板的时候,有时候针对部分类型需要进行特殊处理,比如对int、short可以直接进行逻辑比较,但是对const char*进行逻辑比较只会比较其指针,需要特殊处理。

模板特化的例子

template<> 表示这是一个特化的模板。

template <class T>
T mymax(const T t1, const T t2)
{
   return t1 < t2 ? t2 : t1;
}

template <>
const char* mymax(const char* t1,const char* t2)
{
   return (strcmp(t1,t2) < 0) ? t2 : t1;
}

模板偏特化的例子

stl库中vector的定义中的一部分

template <class T, class Allocator>
class vector { // … // };
template <class Allocator>
class vector<bool, Allocator> { //…//};
偏特化即将模板中的部分类型明确,三种类型优先级顺序:全特化模板>偏特化模板>主版本模板。




相关标签: STL