随笔 - 111, 文章 - 0, 评论 - 39, 阅读 - 61万
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

随笔分类 -  C++

STL源码剖析 Effective C++ 55
摘要:【转】http://www.cppblog.com/Sandywin/archive/2007/07/13/27984.html使用stringstream对象简化类型转换C++标准库中的<sstream>提供了比ANSI C的<stdio.h>更高级的一些功能,即单纯性、类型安全和可扩展性。在本文中,我将展示怎样使用这些库来实现安全和自动的类型转换。为什么要学习如果你已习惯了<stdio.h>风格的转换,也许你首先会问:为什么要花额外的精力来学习基于<sstream>的类型转换呢?也许对下面一个简单的例子的回顾能够说服你。假设你想用sprint 阅读全文

posted @ 2011-10-20 17:20 李大嘴 阅读(1461) 评论(0) 推荐(0) 编辑

摘要:C++中好像不区分内部类与嵌套类两个名词。内部类与嵌套类都是指在类中定义类。局部类是指在函数中定义类。(c++不能在函数中定义函数。c++在类中定义的函数也就是成员函数。)(c++内部类与java内部类最大的区别就是:c++的内部类对象没有外部类对象的指针,不能访问外部类对象的非静态成员;java的非静态内部类对象有外部类对象的指针,能访问外部类对象的非静态成员。) 阅读全文

posted @ 2011-10-20 17:18 李大嘴 阅读(2250) 评论(0) 推荐(0) 编辑

摘要:最近看了下Inside C++里面讲的对虚继承层次的对象的内存布局,发现在不同编译器实现有所区别。因此,自己动手探索了一下。结果如下:首先,说说GCC的编译器.它实现比较简单,不管是否虚继承,GCC都是将虚表指针在整个继承关系中共享的,不共享的是指向虚基类的指针。class A {int a;virtual ~A(){}};class B:virtual public A{virtual ~B(){}virtual void myfunB(){}};class C:virtual public A{virtual ~C(){}virtual void myfunC(){}};class D:p 阅读全文

posted @ 2011-09-02 11:13 李大嘴 阅读(2300) 评论(0) 推荐(1) 编辑

摘要:使用dynamic_cast就必须在编译器中启动RTTI,即“运行时期类型识别”。默认情况下编译器是不启动RTTI的。凡是程序中用到了RTTI(比如typeid)都要在编译器中打开RTTI,这样才能正确编译。VC6下启动RTTI:Project->settings->c/c++->category->c++ language,将Enable Run-Time Type Infomation(RTTI)选中,或者直接使用/GR编译选项.VS.net2003下启动RTTI:项目->项目属性->C/C++->语言,将“启用运行时类型信息” 选择为“是”。 阅读全文

posted @ 2011-09-02 11:11 李大嘴 阅读(1075) 评论(0) 推荐(1) 编辑

摘要:要使用RTTI特性,必须包含<typeinfo>头文件,并且要使用/GR开启运行时信息,在visual studio中打开该项目的“属性页”对话框。有关详细信息,请参见如何:打开项目属性页。单击“C/C++”文件夹。单击“语言”属性页。修改“启用运行时类型信息”属性。在g++中应该是在编译时使用命令/GR即可,(这个本人不是很确定,没实验过)先给一小段代码: class A{public:virtual ~A(){}};class B:public A{}; 一: dynamic_cast强制转换运算符将一个基类的指针或者引用转换为其子类的指针或者引用,其使用方法为:dynamic 阅读全文

posted @ 2011-09-02 11:11 李大嘴 阅读(1341) 评论(0) 推荐(0) 编辑

摘要:【转载】--谢谢原文作者的总结对虚继承层次的对象的内存布局,在不同编译器实现有所区别。首先,说说GCC的编译器.它实现比较简单,不管是否虚继承,GCC都是将虚表指针在整个继承关系中共享的,不共享的是指向虚基类的指针。class A {int a;virtual ~A(){}};class B:virtual public A{virtual void myfunB(){}};class C:virtual public A{virtual void myfunC(){}};class D:public B,public C{virtual void myfunD(){}};以上代码中 size 阅读全文

posted @ 2011-08-31 11:25 李大嘴 阅读(901) 评论(0) 推荐(0) 编辑

摘要:http://files.cnblogs.com/qlee/iterator-effective-stl.rar 阅读全文

posted @ 2011-07-27 16:57 李大嘴 阅读(296) 评论(0) 推荐(0) 编辑

摘要:条款41: 了解隐式接口和编译期多态对template参数而言,接口是隐式的implicit,奠基于有效表达式。多态则是通过template具现化和函数重载解析(function overloading resolution)发生于编译器。template<typename T>void doProcessing(T& w) {if (w.size() > 10 && w != someNastyWidget) {T temp(w);temp.normalize();temp.swap(w);}}//w要支持的接口由template中执行于w身上的操作 阅读全文

posted @ 2011-07-08 21:28 李大嘴 阅读(511) 评论(0) 推荐(0) 编辑

摘要:条款26: 尽可能延后变量定义式的出现时间01 //方案A和B哪个比较好?02 //方案A03 Widget w;04 for (int i = 0; i < n; ++i) {05 w=...;06 }07 08 //方案B09 for (int i = 0; i < n; ++i) {10 Widget w(...);11 }方案A:1次构造,1次析构,n次赋值方案B:n次构造,n次析构除非你知道(1)赋值成本小于构造+析构 (2)你正在处理代码中效率高度敏感的部分否则应该选择方案B条款27:尽量少做转型动作01 (T)expression //C风格02 T(expressi 阅读全文

posted @ 2011-07-08 20:55 李大嘴 阅读(426) 评论(0) 推荐(0) 编辑

摘要:条款13: 以对象管理资源1.为防止资源泄漏,使用RAII对象,它们在构造函数中获得资源, 在析构函数中释放资源2.两个常用的RAII classes: tr1::shared_ptr和auto_ptr,后者复制会使被复制物指向nullRAII (Resource Acquisition is Initialization): 资源取得时机便是初始化时机------以对象管理资源。auto_ptr:不能让多个auto_ptr指向相同对象,否则对象会删除多次,未定义。 因此,若通过copy构造函数或copy assignment操作符复制它们,它们会变成Null, 而复制所得的指针将取得资源的唯 阅读全文

posted @ 2011-07-08 18:02 李大嘴 阅读(391) 评论(0) 推荐(0) 编辑

摘要:条款01:视C++为一个语言联邦 : C, Object-Oriented C++, Template C++, STL条款02:尽量以const,enum,inline 替换#define:1.对于单纯常量,最好以const对象或enum替换#define2.对于形似函数的宏(macros),最好改用inline函数替换#define#define ASPECT_RATIO 1.653const double AspectRatio = 1.653; 1)用#define定义的名字可能没有进入记号表,编译出错,不方便追踪 2)用const定义常量将得到更精简的目标代码(object code 阅读全文

posted @ 2011-07-08 17:37 李大嘴 阅读(466) 评论(0) 推荐(0) 编辑

摘要:笔者觉得这3个new有点意思,有时候我也被搞懵了,这些创造者难不成觉得C++过于简单,所以搞一点含糊的术语出来。这次总结一下,以便再懵的时候有个参考。有错的地方请不吝赐教,多谢先!简单点吧:1. new operator,即熟悉的new操作符,用它从堆中分配一个对象,并且初始化。CHeapObject* p=new CHeapObject(name);既然是操作符,那么它的行为就和其他+-*/操作符一样,是由C++语言定义的,不能改变,即使通过重载的方式也不能改变。C++规定了new操作符的行为:分配一个合适的空间容纳CHeapObject对象,然后调用其构造函数初始化对象。2. operat 阅读全文

posted @ 2011-07-08 10:36 李大嘴 阅读(224) 评论(0) 推荐(0) 编辑

摘要:nothrow是在C++标准头文件<new>中定义的一个nothrow_t类的对象。nothrow_t类是这样定义的: struct nothrow_t { }; 可见它只是一个什么都不做的空类。new仅仅使用这个空类对象达到一种标识作用,而不是利用这个类对象的功能。通常称这样的类对象为占位符。 C++标准规定 new 在分配内存失败的时候会抛出异常,因此在C++程序中应该通过捕捉异常来处理内存失败的情况。与之不同,传统的C语言中的malloc()函数分配内存失败时返回NULL指针。为了提供与malloc()函数一致的行为,即在内存分配失败时返回一个NULL指针,而不是抛出异常,C 阅读全文

posted @ 2011-07-07 22:16 李大嘴 阅读(666) 评论(0) 推荐(0) 编辑

摘要:1. GCC对TR1库的支持状况你可以到GCC对TR1的支持状态查看最新状态。目前,GCC对TR1库的支持均实现在单独的文件中,并都统一放在tr1子目录下,例如shared_ptr就位于头文件<tr1/momery>中。目前,GCC 4.3已经支持的TR1库有元组(tuple)、智能指针(shared_ptr、weak_ptr)、数组容器(array)、无序容器(unordered_set、unordered_multiset、unordered_map、unordered_multimap)、类型特性(type_traits)、调用包装与函数对象(mem_fn、reference 阅读全文

posted @ 2011-07-04 17:26 李大嘴 阅读(3393) 评论(0) 推荐(1) 编辑

摘要:在C++的TR1中(Technology Report)中包含一个function模板类和bind模板函数,使用它们可以实现类似函数指针的功能,但却却比函数指针更加灵活,特别是函数指向类的非静态成员函数时。可以参考Scott Meyers. <<Effective C++ (3rd Edition)>>. Item 35.下面具体说明其使用方法。一、指向全局函数或静态成员函数时因为在本质上讲全局函数和静态成员函数没有区别,使用方法上除了静态成员函数在引用时要在前面加域作用符className::外,没有其它任何区别,事实上全局函数也有可能放入命名空间,或者使用全局域作用 阅读全文

posted @ 2011-07-04 17:16 李大嘴 阅读(16217) 评论(0) 推荐(2) 编辑

摘要:C++中 public,protected, private 访问标号小结,即访问标号使用限制。第一:private, public, protected 访问标号的访问范围。private:只能由1.该类中的函数、2.其友元函数访问。不能被任何其他访问,该类的对象也不能访问。protected:可以被1.该类中的函数、2.子类的函数、以及3.其友元函数访问。但不能被该类的对象访问。public:可以被1.该类中的函数、2.子类的函数、3.其友元函数访问,也可以由4.该类的对象访问。注:友元函数包括3种:设为友元的普通的非成员函数;设为友元的其他类的成员函数;设为友元类中的所有成员函数。第二: 阅读全文

posted @ 2011-07-04 11:36 李大嘴 阅读(8068) 评论(1) 推荐(1) 编辑

摘要:成员函数的重载、覆盖与隐藏成员函数的重载、覆盖(override)与隐藏很容易混淆,C++程序员必须要搞清楚概念,否则错误将防不胜防。8.2.1 重载与覆盖成员函数被重载的特征:(1)相同的范围(在同一个类中);(2)函数名字相同;(3)参数不同;(4)virtual 关键字可有可无。覆盖是指派生类函数覆盖基类函数,特征是:(1)不同的范围(分别位于派生类与基类);(2)函数名字相同;(3)参数相同;(4)基类函数必须有virtual 关键字。示例8-2-1 中,函数Base::f(int)与Base::f(float)相互重载,而Base::g(void)被Derived::g(void)覆 阅读全文

posted @ 2011-07-04 09:08 李大嘴 阅读(52019) 评论(7) 推荐(3) 编辑

摘要:【转载】http://www.blogjava.net/bacoo/archive/2009/06/22/283480.html对模板特化的理解:特化整体上分为全特化和偏特化,这一点大家都没有什么置疑,但是细分它们各包括哪几种状态就很难界定了,而且很多权威的书上都不一致,管它呢,反正我们能会用各种特化就可以了。下面就谈谈我个人对特化的划分和定义:所谓特化,就是将泛型的东东搞得具体化一些,从字面上来解释,就是为已有的模板参数进行一些使其特殊化的指定,使得以前不受任何约束的模板参数,或受到特定的修饰(例如const或者摇身一变成为了指针之类的东东,甚至是经过别的模板类包装之后的模板类型)或完全被指 阅读全文

posted @ 2011-06-27 17:07 李大嘴 阅读(14692) 评论(0) 推荐(0) 编辑

摘要:排序一直是数据结构中的常用算法,STL提供的排序算法非常丰富,如何有效使用就值得探讨。在网上没有找到条款31的翻译,于是我自己翻译了。--Winter如何进行排序?让我数数有几种方法。一旦程序员需对容器元素进行排序,sort算法马上就会出现在他的脑海(可能有些程序员会想到qsort,但详细阅读条款46后,他们会放弃使用qsort的想法,转而使用sort算法)。sort是一个非常优秀的算法,但并当你并不真正需要它的时候,其实就是一种浪费。有时你并不需要一个完整的排序(简称为全排序)。例如,你现有一个包含Widget对象(Widget意为“小挂件”)的vector容器,并且你想把其中质量最好的20 阅读全文

posted @ 2011-05-25 20:48 李大嘴 阅读(6386) 评论(2) 推荐(3) 编辑

摘要:forward_iterator_tag这种类型的迭代器只能像前移动,所以算法实现上很纠结。大体过程是不断交换[first, mid) 和 [mid, last) 两个区间的元素。没有多少复杂的数学推导,想清楚过程就行了,故不赘述。以交换作为单位操作,时间消耗是n。(注意,这三个算法的空间复杂度都是O(1),时间O(n)。所以不谈复杂度,谈具体消耗,并且要指明单位操作。)bidirectional_iterator_tag这种类型的迭代器可以双向移动,于是它是支持reverse操作的。估计大部分人在网上看到的面试题,都是讲的这套算法,如下:reverse(begin, mid)reverse( 阅读全文

posted @ 2011-05-24 15:10 李大嘴 阅读(3434) 评论(0) 推荐(0) 编辑

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