《STL源码剖析》学习笔记

1 篇文章 0 订阅

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> { //…//};
偏特化即将模板中的部分类型明确,三种类型优先级顺序:全特化模板>偏特化模板>主版本模板。




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值