摘要: class base {}; class sub : public base {}; boost::shared_ptr bb(new sub()); base的析构函数并不是virtual的,但是,离开作用域后,将调用sub的析构函数而不是base的析构函数。 shared_ptr中的两个数据成员: T * px; // contained po... 阅读全文
posted @ 2013-01-12 18:04 avexer 阅读(176) 评论(0) 推荐(0) 编辑
摘要: 一、构造函数初始化列表的异常机制class demo{public: demo(int size) try : _array(new int[size]) { } catch (bad_alloc&) { }private: int *_array;};假设在分配内存时发生了异常,并且被我们catch到,但是,这个异常仍然会继续向外抛,以让调用者知道。可以这么说,编译器在每个catch块的最后又为我们加了一行throw;因此,安全起见,在构造这个对象的代码处,还需再写一次try,catch。try{ demo obj;}catch (bad_alloc&){}二、构造函数体中的 阅读全文
posted @ 2013-01-12 14:58 avexer 阅读(121) 评论(0) 推荐(0) 编辑
摘要: 有下面两个类:class base{};class sub : public base{};下面的异常代码:try{ base *bb = new sub(); throw(bb);}catch (sub*){ std::cout<<”this handler won’t execute”;}catch (base*){ std::cout<<”exxcute this handler”<<std::endl;}因此,最好不要throw指针类型的异常。 阅读全文
posted @ 2013-01-12 13:04 avexer 阅读(109) 评论(0) 推荐(0) 编辑
摘要: 默认析构函数与空析构函数并不完全等价 !完整类型 ! 阅读全文
posted @ 2013-01-11 22:48 avexer 阅读(307) 评论(0) 推荐(0) 编辑
摘要: 在看boost相关的资料时,看到一个术语“完整类型”,以前一直没注意过这个。所谓的C++完整类型,就是说,仅仅有类型的前向声明时不够的,必须要有类的完整定义。// fuck.hclass shit;class fuck{public:fuck(); //~fuck();private: std::auto_ptr _pshit;};在fuck这个类中中,没有定义析构函数,编译器会提供一个默认的析构函数,析构auto_ptr对象,进而delete shit。但是,由于在此,只有shit的声明,却没有它的完整定义,因此shit的析构函数将不会被调用。编译器也会提示C4105这个警告。为了避免这样的 阅读全文
posted @ 2013-01-11 21:45 avexer 阅读(237) 评论(0) 推荐(0) 编辑
摘要: std::mem_ptr与std::mem_ptr_ref都需要一个类的成员函数指针作为参数,然后返回一个包装对象。这个包装对象重载了operator(),该对象内部仅有一个成员:参数传进的一个成员函数的地址。 调用成员函数时还需要一个对象实例,这个实例就是在调用operator()会传进来的,对于std::mem_ptr的operator()的参数是对象指针,而对于std::mem_ptr_re... 阅读全文
posted @ 2013-01-05 19:56 avexer 阅读(185) 评论(0) 推荐(0) 编辑
摘要: 1.下载 & 解压2.cdSTLport-5.2.13.configure msvc9 --with-dynamic-rtl4.cd build/lib5.nmake clean install6.将STLport-5.2.1\stlport和STLport-5.2.1\lib分别添加到VS2008的include和lib目录中去可以新建个项目测试一下,默认情况下会动态链接到stlport,要想静态链接需要#define _STLP_USE_STATIC_LIB。至于上面步骤3中的with-dynamic-rtl参数,因为默认情况下stlport编译产生的lib,只能与静态的CRT进行 阅读全文
posted @ 2012-12-24 20:29 avexer 阅读(145) 评论(0) 推荐(0) 编辑
摘要: 为了便于输出_x和_y的值,直接将它们声明为public。如果在子类中主动调用父类的构造函数将会发现输出的_x的值为0。class base_class{public: base_class(int val = 0) : _x(val) { std::cout<<"base_class() con"<<std::endl; } base_class(const base_class &rhs) : _x(rhs._x) { std::cout<<"base_class() copy"<<std::e 阅读全文
posted @ 2012-11-27 20:23 avexer 阅读(117) 评论(0) 推荐(0) 编辑
摘要: SMTP还是比较简单的,首先使用tcp协议连接自己邮箱的smtp服务器的25号端口,接着就是一次send给服务器发送命令,一次recv读取服务器的返回状态。 大家可以使用windows自带的telnet工具来测试学习smtp协议。 下面是C++实现的代码,参考了不少资料,其中的check_server_response()函数没写完,未考虑命令执行失败的情况。代码中使用了上一篇文章中的Base64... 阅读全文
posted @ 2012-11-25 20:16 avexer 阅读(253) 评论(0) 推荐(0) 编辑
摘要: 借助Base64可以将任意的二进制数据格式转换为可见字符的形式。每3个字节被转换为4个字符,转换之后的字符长度一定为4的倍数。 因此,如果只有两个字节,只能转换为3个字符,因此最后需要补一个字符'=';同理1个字节最后需要补两个'='。 class Base64Encode{public: Base64Encode() { memcpy(_base_char, "ABCDEFGHIJKLMNOP... 阅读全文
posted @ 2012-11-22 21:44 avexer 阅读(200) 评论(0) 推荐(0) 编辑