敲了几天的基础知识demo,发现特别容易忘记,于是决定接下来的每一天都把敲过的基础代码贴到博客上,一来是自己把知识点重新梳理,加深理解;二来是把自己对一些问题的解决办法都记录下来,以便以后备忘。
今天的知识点比较零乱,我得好好整理。
1.引用包装器
#include <iostream>
template<typename T>
void com(T arg)
{
std::cout << &arg << std::endl;
arg++;
}
void main()
{
int num = 20;
std::cout << &num << " " << num << std::endl;
com(std::ref(num));//std::ref//会把传入的值包装成可引用的值
com(num);
std::cout << &num << " " << num << std::endl;
std::cin.get();
}
2.C++智能指针
unique_ptr是一个独享所有权的智能指针,它提供了严格语义上的所有权,包括:
1,拥有它所指向的对象;
2,无法进行复制构造,也无法进行复制赋值操作。也就是说,我们无法得到指向同一个对象的两个unique_ptr。但是可以进行移动构造和移动赋值操作。
3,保存指向某个对象的指针,当它本身被删除释放的时候,会使用给定的删除器释放它所指向的对象。
c++11新出现的智能指针auto_ptr,存在于头文件memory中。
下面的代码是VS2013里面的源码:
template<class _Ty,
class _Dx> // = default_delete<_Ty>
class unique_ptr
: private _Unique_ptr_base<_Ty, _Dx,
is_empty<_Dx>::value
|| is_same<default_delete<_Ty>, _Dx>::value>
{ // non-copyable pointer to an object
public:
typedef unique_ptr<_Ty, _Dx> _Myt;
typedef _Unique_ptr_base<_Ty, _Dx,
is_empty<_Dx>::value
|| is_same<default_delete<_Ty>, _Dx>::value> _Mybase;
typedef typename _Mybase::pointer pointer;
typedef _Ty element_type;
typedef _Dx deleter_type;
using _Mybase::get_deleter;
unique_ptr() _NOEXCEPT
: _Mybase(pointer())
{ // default construct
static_assert(!is_pointer<_Dx>::value,
"unique_ptr constructed with null deleter pointer");
}
unique_ptr(nullptr_t) _NOEXCEPT
: _Mybase(pointer())
{ // null pointer construct
static_assert(!is_pointer<_Dx>::value,
"unique_ptr constructed with null deleter pointer");
}
_Myt& operator=(nullptr_t) _NOEXCEPT
{ // assign a null pointer
reset();
return (*this);
}
explicit unique_ptr(pointer _Ptr) _NOEXCEPT