《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> { //…//};
偏特化即将模板中的部分类型明确,三种类型优先级顺序:全特化模板>偏特化模板>主版本模板。上一篇: 荐 python3入门笔记
下一篇: 登陆kde黑屏最终解决方案