模板手机网站建设价格明细表,做二手网站有哪些问题,wordpress首页图片导航分类,制作一般网站完美转发及其实现
函数模版可以将自己的参数完美地转发给内部调用的其他函数。所谓完美#xff0c;即不仅能准确地转发参数的值#xff0c;还能保证被转发参数的左右值属性不变引用折叠#xff1a;如果任一引用为左值引用#xff0c;则结果为左值引用#xff0c;否则为右…完美转发及其实现
函数模版可以将自己的参数完美地转发给内部调用的其他函数。所谓完美即不仅能准确地转发参数的值还能保证被转发参数的左右值属性不变引用折叠如果任一引用为左值引用则结果为左值引用否则为右值引用。 - - - - void actualRun(int a) {}
template typename T
void testPerfectForward(T param) {actualRun(param);
}void testPerfectForwardMain() {int a 0;testPerfectForward(a);
}上述 T 为int 。 那么整个为 int - int
回到完美转发假设现在我需要转发a那么注意一下实现完美转发需要这样写 template typename T
void testPerfectForward1(T param) {actualRun(std::forward(param));
}forward大致实现原理 static_cast
template typename T
T forwad(T param) {return static_castT(param);
}注意其实std::move底层实现也是 static_cast
C11 nullptr初始化空指针
#define NULL 0
#include iostream
using namespace std;void isnull(void *c){cout void*c endl;
}
void isnull(int n){cout int n endl;
}void testNull1() {isnull(0);//isnull(NULL);//Call to isnull is ambiguousisnull((void*)NULL);/*int nvoid*c*/
}1 . nullptr 是 nullptr_t 类型的右值常量专用于初始化空类型指针。nullptr_t 是 C11 新增加的数据类型可称为“指针空值类型”。也就是说nullpter 仅是该类型的一个实例对象已经定义好可以直接使用如果需要我们完全定义出多个同 nullptr 完全一样的实例对象。
nullptr 可以被隐式转换成任意的指针类型。故如下 void testNull2() {isnull(0);//isnull(NULL);//Call to isnull is ambiguousisnull((void*)NULL);isnull(nullptr);/*int nvoid*cvoid*c*/}借助执行结果不难看出由于 nullptr 无法隐式转换为整形而可以隐式匹配指针类型因此执行结果和我们的预期相符
void testNullMain() {
// int *p 0;
// int *q NULL;
// testNull1(0);
// testNull1(NULL);
}
.C11 shared_ptr智能指针
void deleteInt(int *p) {delete []p;
}
void testSharedPtr () {std::cout testSharePtr: endl;//初始化空的shareptr,引用计数为0不是1std::shared_ptrint p1;std::shared_ptrint p2(nullptr);std::shared_ptrint p3(new int(10));std::shared_ptrint p4 std::make_sharedint(10);//调用拷贝构造函数std::shared_ptrint p5(p4); //或者 p4 p3;//调用移动构造函数std::shared_ptrint p6(std::move(p4)); //或者p6 std::move(p4)//智能指针可以拷贝给多个智能指针用引用计数1但是普通指针只能拷贝给一个智能指针int *p new int(1);std::shared_ptrint pp1(p);
// std::shared_ptrint pp2(p); //错误// 在初始化 shared_ptr 智能指针时还可以自定义所指堆内存的释放规则这样当堆内存的引用计数为 0 时会优先调用我们自定义的释放规则。在某些场景中自定义释放规则是很有必要的比如对于申请的动态数组来说share—_ptr指针默认的释放规则是不支持释放数组的值呢个自定义对于的释放规则如下//释放规则可以使用 C11 标准中提供的 default_deleteT 模板类我们也可以自定义释放规则std::shared_ptrint p10(new int[10], std::default_deleteint[]());std::shared_ptrint p11(new int[10], deleteInt);std::shared_ptrint p12(new int[10], [](int *p){delete []p;});std::shared_ptrint ppp1 std::make_sharedint(10);std::shared_ptrint ppp2(ppp1);std::cout *ppp2 endl;cout ppp2.use_count()endl;ppp1.reset();if (p1) {std::cout ppp1 is not null ! endl;} else {std::cout ppp1 is null ! endl;}std::cout *ppp2 endl;cout ppp2.use_count()endl;
} 表 1 shared_ptrT模板类常用成员方法成员方法名 功 能operator() 重载赋值号使得同一类型的 shared_ptr 智能指针可以相互赋值。operator*() 重载 * 号获取当前 shared_ptr 智能指针对象指向的数据。operator-() 重载 - 号当智能指针指向的数据类型为自定义的结构体时通过 - 运算符可以获取其内部的指定成员。swap() 交换 2 个相同类型 shared_ptr 智能指针的内容。reset() 当函数没有实参时该函数会使当前 shared_ptr 所指堆内存的引用计数减 1同时将当前对象重置为一个空指针当为函数传递一个新申请的堆内存时则调用该函数的 shared_ptr 对象会获得该存储空间的所有权并且引用计数的初始值为 1。get() 获得 shared_ptr 对象内部包含的普通指针。use_count() 返回同当前 shared_ptr 对象包括它指向相同的所有 shared_ptr 对象的数量。unique() 判断当前 shared_ptr 对象指向的堆内存是否不再有其它 shared_ptr 对象再指向它。operator bool() 判断当前 shared_ptr 对象是否为空智能指针如果是空指针返回 false反之返回 true。*/C11 unique_ptr智能指针
unique_ptr 指针指向的堆内存无法同其它 unique_ptr 共享也就是说每个 unique_ptr 指针都独自拥有对其所指堆内存空间的所有权
void testUniqueptr() {std::unique_ptrint p1(new int(3));
// std::unique_ptrint p1(p2);std::unique_ptrint p2(std::move(p1));// 默认情况下unique_ptr 指针采用 std::default_deleteT 方法释放堆内存。当然我们也可以自定义符合实际场景的释放规则。值得一提的是和 shared_ptr 指针不同为 unique_ptr 自定义释放规则只能采用函数对象的方式。例如struct myDel {void operator()(int *p) {delete p;}};std::unique_ptrint, myDel p7(new int);
// std::unique_ptrint, myDel p6(new int);std::unique_ptrint p10(new int);*p10 10;//p10释放当前所指堆的所有权 但该存储空间不会被销毁转移给了pint *p p10.release();std::unique_ptrint p11;//中 p 表示一个普通指针如果 p 为 nullptr则当前 unique_ptr 也变成空指针反之则该函数会释放当前 unique_ptr 指针指向的堆内存如果有然后获取 p 所指堆内存的所有权p 为 nullptr。p11.reset(p);// int *p2 p;
}C11 weak_ptr智能指针
weak_ptr是为了配合shared_ptr而引入的一种智能指针它不具有普通指针的行为没有重载*和-两个操作符它的最大作用在于协助shared_ptr工作像旁观者那样观测资源的使用情况。 weak_ptr可以从一个shared_ptr或者另一个weak_ptr对象构造获得资源的观测权。但weak_ptr没有共享资源它的构造不会引起指针引用计数的增加。 使用weak_ptr的成员函数use_count()可以观测资源的引用计数另一个成员函数expired()的功能等价于use_count()0,但更快表示被观测的资源 (也就是shared_ptr的管理的资源)已经不复存在。 weak_ptr可以使用一个非常重要的成员函数lock()从被观测的shared_ptr 获得一个可用的shared_ptr对象从而操作资源。但当expired()true的时候lock()函数将返回一个存储空指针的shared_ptr。
shared_from_this
#includememoryclass Test: public std::enable_shared_from_thisTest
{public: Test();~Test();std::shared_ptrTest getSharedFromThis(){return shared_from_this();}
}在什么情况下要使类A继承enable_share_from_this
使用场合当类A被share_ptr管理且在类A的成员函数里需要把当前类对象作为参数传给其他函数时就需要传递一个指向自身的share_ptr。
我们就使类A继承enable_share_from_this然后通过其成员函数share_from_this()返回当指向自身的share_ptr。
以上有2个疑惑
1.把当前类对象作为参数传给其他函数时为什么要传递share_ptr呢直接传递this指针不可以吗
一个裸指针传递给调用者谁也不知道调用者会干什么假如调用者delete了该对象而share_tr此时还指向该对象。
2.这样传递share_ptr可以吗share_ptr
这样会造成2个非共享的share_ptr指向一个对象最后造成2次析构该对象。 ———————————————— 引用链接https://blog.csdn.net/zk3326312/article/details/79108690 http://c.biancheng.net/view/3730.html