随笔分类 -  深入学习C++

Effective C++ Inside The C++ Object Model
摘要:STL中,traits编程技法得到了很大的应用,了解这个,才能一窥STL奥妙所在。先将自己所理解的记录如下:Traits技术可以用来获得一个 类型 的相关信息的。 首先假如有以下一个泛型的迭代器类,其中类型参数 T 为迭代器所指向的类型:template <typename T>class myIterator{...};当我们使用myIterator时,怎样才能获知它所指向的元素的类型呢?我们可以为这个类加入一个内嵌类型,像这样:template <typename T>class myIterator{ typedef T value_type;...};这样当我们 阅读全文
posted @ 2012-08-15 11:30 kanego 阅读(2977) 评论(0) 推荐(1) 编辑
摘要:最近在看侯捷老师的《STL源码剖析》,非常感叹其中空间配置器实现的巧妙和细致,对效率真正是锱铢必较。 一般我们所习惯的内存配置和释放是通过new和delete来完成的,而new运算包含了两个阶段:1.调用::operator new配置内存 2.调用构造函数 Foo() 构造对象。delete运算也包含两个阶段:1.调用析构函数 ~Foo() 将对象析构 2.调用::operator delete释放内存。1 class Foo { … };2 Foo *pf = new Foo;3 delete pf; 而SGI STL为了提高效率则是把二者分开的,对象的构造的析构由 constr... 阅读全文
posted @ 2012-08-14 20:51 kanego 阅读(1346) 评论(3) 推荐(0) 编辑
摘要:看起来,float转型string,std中没有提供标准的方法。查阅了些资料。总结如下:1、利用boost中的format类去实现。如下:cout << format( "%1% says \"%2%\" to %1%.\n" ) % "Yousen" % "Hello";这句话将在标准输出上输出“Yousen says "Hello" to Yousen.”接下来简单说明一下format的用法。在格式化字符串中,“%1%”(不带引号,后称占位符)表示后面跟的第一个参数,“%2%”则 阅读全文
posted @ 2012-07-06 08:04 kanego 阅读(22703) 评论(0) 推荐(0) 编辑
摘要:最近在看STL源码剖析这本书,这本书分析的对象是SGI STL。在讲述第二级配置器的实现内容时,有这么一段代码: enum {__ALIGN=8}; size_t ROUND_UP(size_t bytes) //将bytes上调至8的倍数 { return (((__bytes) + (size_t) _ALIGN-1) & ~((size_t) _ALIGN – 1)); } 毫无疑问,这段代码是非常高效的。仔细分析一下,就会发现这段代码适合用来将所有数上调至2^n的倍数:一个数k如果正好是2^n的倍数,那么用二进制来 表示的话,低n位必定全是0,而_ALIGN-1的二进制表示则是 阅读全文
posted @ 2012-04-22 21:00 kanego 阅读(1565) 评论(1) 推荐(3) 编辑
摘要:看来不错,转载自http://blog.csdn.net/s_51563946/article/details/4458480引言如果在您的开发过程中遇到了常见的错误,或许您的Release版本不能正常运行而Debug版本运行无误,那么我推荐您阅读本文:因为并非如您想象的那样,Release版本可以保证您的应用程序可以象Debug版本一样运行。如果您在开发阶段完成之后或者在开发进行一段时间之内从来没有进行过Release版本测试,然而当您测试的时候却发现问题,那么请看我们的调试规则1:规则1: 经常性对开发软件进行Debug和Release版本的常规测试.测试Release版本的时间间隔越长, 阅读全文
posted @ 2012-03-26 20:29 kanego 阅读(1511) 评论(0) 推荐(0) 编辑
摘要:一. 回顾指针概念: 今天我们又要学习一个叫做指向另一指针地址的指针。让我们先回顾一下指针的概念吧! 当我们程序如下申明变量: short int i; char a; short int * pi; 程序会在内存某地址空间上为各变量开辟空间,如下图所示。 内存地址→6 78 9 10 111213 1415 ------------------------------------------------------------------------------------- …| ||||| |||| ----------------------------------... 阅读全文
posted @ 2012-03-18 19:46 kanego 阅读(749) 评论(0) 推荐(0) 编辑
摘要:如何在编译器(vs2008)里设置调用别人写好的lib和dll步骤:1.Tools->options->projects and solutions->VC++ directories分别在包含文件,库文件填加了路径 (这些路径只告诉编译器怎么找文件,没有说把那里面的文件加入工程.) (若不设置,编译报错:无法打开***文件) 2.Project->properties->c/c++->general->additional include directories 添加包含文件 Project->properties->linker-> 阅读全文
posted @ 2012-02-10 10:44 kanego 阅读(22161) 评论(4) 推荐(4) 编辑
摘要:View Code “CTest<T>::~CTest” : 不允许 dllimport 函数 的定义 “CTest<T>::CTest” : 不允许 dllimport 函数 的定义//代码如下template<class T>class __declspec(dllimport) CTest{public: CTest(); ~CTest();};template<class T>CTest<T>::CTest(){//}template<class T>CTest<T>::~CTest(){//} 当要使 阅读全文
posted @ 2012-02-02 21:25 kanego 阅读(17539) 评论(0) 推荐(1) 编辑
摘要:读起C++对象模型,有点吃力。真的很吃力。。P140C++支持三种类型的成员函数:static,nonstatic,virtual.P141C++的设计准则之一就是:nonstaic member function至少必须和一般的nonmember function有相同的效率。在设计上为了支持这一准则,编译器内部已将"member 函数实体"转换为对等的"nonmember 函数实体"。下面是转化的步骤1. 改写函数的signature(意指函数原型)以安插一个额外的参数到member function中,用以提供一个存取管道,使class objec 阅读全文
posted @ 2011-11-30 09:44 kanego 阅读(462) 评论(0) 推荐(0) 编辑
摘要:看一些开源库,里面好多类有一个**IMPL。经查询还是有些门道和说法的。查询了一些相关资料。(英文没有翻译,挺简单的。)PIMPL 也可以称为一种设计模式了。现在摘录如下:pimpl 手法在 C++ 里已是“高手”们广泛运用的成熟方法之一,它的优点很多,诸如降低编译依赖、提高重编译速度之类的工具性优势自不待赘言,而其对“保持接口稳定性”的优点更值得称道。It makes it possible to avoid other classes to know internal data structures and other information of the class. It also s 阅读全文
posted @ 2011-11-23 19:05 kanego 阅读(12099) 评论(5) 推荐(3) 编辑
摘要:C++在“商业应用”方面,曾经是天下第一的开发语言,但这一桂冠已经被java抢走多年。因为当今商业应用程序类型,已经从桌面应用迅速转移成Web应 用。当Java横行天下之后,MS又突然发力,搞出C#语言,有大片的曾经的C++程序员,以为C++要就此沉沦,未料,这三年来,C++的生命力突然被 严重地增强了。主力原因就是开源的软件、基础软件(比如并发原生支持,比如Android必定要推出原生的SDK)、各种跨平台应用的出现。开源C++库必须具有以下特点:必须是成熟的产品、跨平台的产品、相对通用的库。一、通用标准类STL:C++标准模板库,呵呵,它也是开源的嘛。boost:C++准标准库,它是强大地 阅读全文
posted @ 2011-11-10 21:06 kanego 阅读(13895) 评论(43) 推荐(31) 编辑
摘要:这个问题困惑好几天了。废话不多说,先上代码。 1 #include <iostream> 2 using namespace std; 3 4 class A 5 { 6 public: 7 virtual void aa() 8 { 9 } 10 private: 11 char k[3]; 12 }; 13 14 class B:public A 15 { 16 public: 17 virtual void bb() 18 { 19 } 20 privat... 阅读全文
posted @ 2011-11-06 20:22 kanego 阅读(1541) 评论(0) 推荐(0) 编辑
摘要:下列情况,为了让程序顺利编译,必须使用成员初始化表。1、当初始化一个reference member时; 2、当初始化一个const member时; 当类成员中含有一个const对象时,或者是一个引用时,他们也必须要通过成员初始化列表进行初始化,因为这两种对象要在声明后马上初始化,而在构造函数中,做的是对它们的赋值,这样是不被允许的。 3、当调用一个base class的constructor,而它拥有一组参数时; 4、当调用一个member class的constructor,而它拥有一组参数时;list中的项目执行次序是由class中的members 的声明次序决定的,不是由initia 阅读全文
posted @ 2011-11-06 16:55 kanego 阅读(348) 评论(0) 推荐(0) 编辑
摘要:类型需要虚析构函数的另外一个特征 是该类型具有指针成员或引用成员。如果有指针成员和引用成员,则该类型通常需要实现析构函数以及拷贝操作。通常,一个实现了析构函数的类型同时也需要实现拷贝构造函数与拷贝复制函数。作为一个经验法则:如果你有一个带有虚函数功能的类,则它需要一个虚析构函数,原因如下:1. 如果一个类有虚函数功能,它经常作为一个基类使用。2.如果它是一个基类,它的派生类经常使用new来分配。3.如果一个派生类对象使用new来分配,并且通过一个指向它的基类的指针来控制,那么它经常通过一个指向它的基类的指针来删除它(如果基类没有虚析构函数,结果将是不确定的,实际发生时,派生类的析构函数永远不会 阅读全文
posted @ 2011-10-03 18:51 kanego 阅读(14226) 评论(7) 推荐(2) 编辑

点击右上角即可分享
微信分享提示