squid源代码学习笔记4.2 C++学习总结

今天抄写了array.h的部分内容,到目前为止用到了许多C++特有的特性,在这里做一个总结。

C++中new, delete new[], delete[]都是运算符,可以被重载,核心是malloc和free空间。squid的array.h中就将其重载为xmalloc xfree以实现自己的一些检测。new一个对象时先调用new运算符,然后调用构造函数,delete时则相反。

C++中的模板template< T const >这种写法表示T是一个常量类型, const_iterator就是用这个实现的。
我想正因为const T 整体可以被识别成一个类型,所以重载的时候const才会发挥作用。

例如
templateint Foo(T, const U*)
{ return 0; }
template<> int Foo(int, const char* const)
{ return 1; }
templateint Foo(T, U*)
{ return 2; }
main:
const char* b = "abc";
Foo(1, &b);
const char* 是个常量指针,&b的类型是const char**, 模板中出现的const都是整个儿类型的,所以模板1中的参数只有const char* const才满足。
const char ** 表示 **v 是const.   const char * const * 表示 *v 和 **v是const.     而const char * const * const 表示 **v *v v 都是const。
传入const char ** 表示**v是const 的,但是 模板0,1都包含const char *表示*v是const的,这就不符合了。
只有模板2符合。

说到常量在C++的函数定义后面有一个const表示函数中this指针是const的。

再例如:
void test(int & const i);
void test (int & i);
当对右值使用时会调用第一个函数,当对左值使用时会调用第二个函数。
这应该是因为右值是一个临时变量, 是不能取地址的,右值只能出现在 = 右边. 因此会被理解为一个常量.

提到右值就不能不提C++的右值引用和move语义,
形如 type && value 的就是一个右值引用。右值引用可用在交换函数或者构造函数中.
它出现的本质实际上是由于C++没有GC,导致在比如构造函数中无法判断是否需要分配新的空间存储参数。
C++本着“谁分配谁释放”的原则,以前是统统分配空间,拷贝内容的,而C#等是统统只引用不拷贝的,因为C#的GC决定了一个对象当引用数为0时会自动释放。这就导致了效率地下。
当参数是右值引用时C++将不会分配新的空间,因为本来右值赋给左值就是不需要重新分配空间的。
为了满足将左值cast为右值的需求(比如交换)C++增加了std::move方法,本质上是用static_cast将左值转为右值。

说到引用还有函数将引用作为返回值的情形,不过考虑到生命周期的问题不推荐这么做,只有当返回的引用赋值给类型内部成员时可以这么做,此时它的生命周期延长为类型内部成员的生命周期。

模板中还涉及到typename,比如在一个类型中有typeof定义的类型,此时泛型templateFoo(...)
{
  T::foo *  c;
}
这个时候T::foo是一个成员,但是单从这句程序看它还可能是个类型,为了区分,当foo是成员时要在前面加上typename。typename T::foo被称为嵌套依赖类型名。例外是初始化列表和基类列表中不需要加typename。

关于模板squid的Array.h中还出现了typename T::value_type,value_type是一个标准特性类, 当T是一个Foo类型时, value_type即为E。

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/26899445/viewspace-757666/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/26899445/viewspace-757666/

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值