
C++再学习系列
文章平均质量分 51
zhenjing
以博结识各地朋友。
愿与所有人分享我所知道的一切!
展开
-
[C++再学习系列] 深入new/delete:Operator new的全局重载
Operator new的全局重载我们经常看到这么一句话:operator new可以重载,placement new不可重载。其实此处所说的不可重载应该是指全局的placement new不可重载,对于类域中的placement new是可以重载的,而且只要重载了任何一种形式的operator new原创 2009-07-16 21:52:00 · 5467 阅读 · 3 评论 -
[C++再学习系列] 虚函数的4条规则
虚函数的4条规则对于常规的基类函数来说:1 尽量使用非虚拟接口模式(NVI)让接口函数成为非虚拟的.2 尽量让虚函数成为私用的.3 只有当派生类需要调用基类对某个虚函数的实现时,才把虚函数声明为保护的.4 基类的析构函数应该要么为共有虚函数原创 2009-07-02 21:32:00 · 1081 阅读 · 0 评论 -
[C++再学习系列] 析构函数不能失败的理由
析构函数不能失败的理由析构函数非常特殊,编译器将在不同的上下文中自动调用。由于其特殊性,C++标准有如下建议:在栈展开过程中,如果析构函数抛异常,terminate函数将被调用。因此,析构函数应该总是能够捕获异常,并且不会让异常传播到析构函数之外。(STL中的所有析构函数均不会失败)。原创 2009-07-02 21:39:00 · 4555 阅读 · 12 评论 -
[C++再学习系列] 隐式类型转换与转换操作符operator T
隐式类型转换与转换操作符operatorTC++标准允许隐式类型转换,即对特定的类,在特定条件下,某些参数或变量将隐形转换成类对象(创建临时对象)。如果这种转换代价很大(调用类的构造函数),隐式转换将影响性能。隐式转换的发生条件:函数调用中,当参数类型不匹配,如果隐式转换后能满足类型匹配条件,编译器将启用类型转换。控制隐式类型转换原创 2009-07-05 21:26:00 · 2252 阅读 · 0 评论 -
[C++再学习系列] 对待拷贝构造函数和赋值函数的3种境界
Normal 0 7.8 磅 0 2 false false false MicrosoftInternetExplorer4 <!-- /* Sty原创 2009-09-03 23:05:00 · 1511 阅读 · 0 评论 -
[C++再学习系列] 二元操作符重载
Normal 0 7.8 磅 0 2 false false false MicrosoftInternetExplorer4 <!-- /* Sty原创 2009-07-05 21:18:00 · 1015 阅读 · 0 评论 -
[C++再学习系列] 避免使用宏
避免使用宏宏是一种文本替换设施,宏替换发生在编译器的预处理阶段,此时C++的语法和语义规则并未去作用,无法对宏的进行任何检查,这将为后续生成代码的编译埋下隐患。此外。宏语法仅能理解小括号和方括号,并不识别template的方括号。举例: MACRO( Foo<int,double> )虽然Foo是一个C++实体原创 2009-07-11 17:02:00 · 793 阅读 · 0 评论 -
[C++再学习系列] 类常量
C++标准允许在类的定义中定义静态整数常量,但其他类型的类常量则需要单独的定义或将常量封装在函数中。举例: // File widget.hclass Widget { static const int defaultWidth= 400; // value provided indeclaration static const doubl原创 2009-07-11 17:05:00 · 646 阅读 · 0 评论 -
[C++再学习系列] 具有链接的C++实体
具有链接的实体,包括名字空间级的变量和函数,都是需要分配内存的。具有链接的实体如果在源文件(cpp)中出现多次,将意味着多次分配内存,每个内存空间定义一个特定的实体。这会导致:1) 空间膨胀;2) 出现多个变量,变量的状态不共享。 因此,不能将下面的代码放在头文件:// avoid defining ent原创 2009-07-11 17:13:00 · 1176 阅读 · 0 评论 -
[C++再学习系列] 深入new/delete:New的3种形态
New的3种形态:new operator、operator new、placement newnew 操作符(new 表达式, newoperator, new expression): 通常我们调用 X * pX = new X 时使用的就是这个操作符原创 2009-07-14 22:16:00 · 1667 阅读 · 1 评论 -
String和内存操作
C99有很多和string相关的函数,如strcat,strchr,strcmp,strcpy,strlen,strncat,strncmp,strncpy等。然而使用C++编程时,所有和string相关的操作均可以原创 2009-09-15 16:42:00 · 2537 阅读 · 2 评论 -
zz 详解Sizeof
前向声明:sizeof,一个其貌不扬的家伙,引无数菜鸟竟折腰,小虾我当初也没少犯迷糊,秉着“辛苦我一个,幸福千万人”的伟大思想,我决定将其尽可能详细的总结一下。但当我总结的时候才发现,这个问题既可以简单,又可以复杂,所以本文有的地方并不适合初学者,甚至都没有必要大作文章。但如果你想“知其然,更知其所以然”的话,那么这篇文章对你或许有所帮助。菜鸟我对C++的掌握尚转载 2009-09-15 17:25:00 · 803 阅读 · 1 评论 -
zz C++的std::string的“读时也拷贝”技术
嘿嘿,你没有看错,我也没有写错,是读时也拷贝技术。什么?我的错,你之前听说写过时才拷贝,嗯,不错的确有这门技术,英文是Copy On Write,简写就是COW,非常’牛’!那么我们就来看看这个’牛’技术的效果吧。我们先编写一段程序01.#include 02.#include 03.#include转载 2009-09-22 10:46:00 · 866 阅读 · 0 评论 -
内存数据的十六进制Print
<!-- /* Style Definitions */ table.MsoNormalTable {mso-style-name:普通表格; mso-tstyle-rowband-size:0; mso-tstyle-colband-size:0; mso-style-noshow:yes; mso-style-parent:""; mso-padding-a原创 2009-11-05 10:15:00 · 7055 阅读 · 0 评论 -
[C++再学习系列] 深入extern关键字
<!-- /* Style Definitions */ table.MsoNormalTable {mso-style-name:普通表格; mso-tstyle-rowband-size:0; mso-tstyle-colband-size:0; mso-style-noshow:yes; mso-style-parent:""; mso-padding-a原创 2009-11-11 14:57:00 · 987 阅读 · 0 评论 -
[C++再学习系列] 可访问性问题
Normal 0 7.8 磅 0 2 false false false MicrosoftInternetExplorer4 <!-- /* Sty原创 2009-07-02 21:22:00 · 883 阅读 · 0 评论 -
[C++再学习系列] 派生类函数的重实现规则(override-覆盖)
Normal 0 7.8 磅 0 2 false false false MicrosoftInternetExplorer4 <!-- /* Sty原创 2009-07-02 21:02:00 · 1635 阅读 · 2 评论 -
[C++再学习系列] 深入new/delete:类域的operator new重载
类域的operator new重载为class 重载 operatornew 时必须定义为类的静态函数(默认为static函数)。重载operator new更多的是为了提高程序效率,比如使用静态内存代替动态分配,启用小对象分配器等。但是要正确重载类域的opera原创 2009-07-16 21:56:00 · 1594 阅读 · 0 评论 -
C++再学习系列:使用合理的引用参数实现接口的自说明
在指针和引用的小文中,主要讨论了引用和指针语法层面上的区别。本文将侧重如何更加合理地利用语言对引用所作限制。 在C++中,指针是最灵活的,也是最危险的。在编程当中,我们可以使用const对指针做限制。下面对const指针做点介绍。 const Type * var; //var指针变量指向一个const Type的对象,因为对象做了const限制,故该指针只能原创 2009-05-17 11:34:00 · 708 阅读 · 0 评论 -
C++再学习系列:引用和指针
下面是网上关于引用和指针区别的常见答案: 引用和指针有如下三种区别: 1 引用必须在声明时初始化,而指针不用; 2 对于NULL不能引用,而指针可以指向NULL; 3 引用一旦声明,引用的对象不能改变(但对象的值可以改变);而指针可以随时改变指向的对象。 引用能做到的,指针也可以,但指针更危险; (1)引用被创建的同时必须被初始化(指针则可以在任何原创 2009-05-15 14:10:00 · 934 阅读 · 0 评论 -
C++再学习系列:前置++与后置++
前置++:type operator++();后置++:const type operator++(int ); 为了编译器区分前置和后置++,C++规定后缀形式有一个int类型参数,当函数被调用时,编译器传递一个0做为int参数的值给该函数。不这样规定,无法区分,因为都仅以自身对象为入参。下面是一个简单的例子:class CInt{原创 2009-05-15 14:17:00 · 1147 阅读 · 0 评论 -
[C++再学习系列] 模板函数的自定义点
模板函数:在编写模板时,可以通过一些显示的自定义,对模板参数类型做一些必要的限制:选择1: 模板直接依赖于类型具有给定名字的合适的成员函数, 则显式要求参数T提供该成员函数.选择2: 模板依赖于”类型具有给定名字的合适的非成员函原创 2009-07-30 21:17:00 · 2233 阅读 · 2 评论 -
[C++再学习系列] 函数模板和类模板
函数模板和类模板C++提供类模板和函数模板。函数模板允许重载,而类模板不允许重载(类无重载概念)。类模板可以进行全特化和偏特化,而函数模板仅能够全特化。因此,写一个看似函数模板偏特化的函数模板实际上是在写一个单独的主函数模板!由于函数模板可以重载,因此存在重载决议。但是记住,函数模板特化并不参与重载。只有在某个主模板函数被重载决议选中的前提下,其特化版本才有可能被使用。原创 2009-07-30 21:44:00 · 1632 阅读 · 3 评论 -
[C++再学习系列] 全局或静态变量(对象)的初始化
全局或静态变量(对象)的初始化对于C语言的全局和静态变量,不管是否被初始化,其内存空间都是全局的;如果初始化,那么初始化发生在任何代码执行之前,属于编译期初始化。由于内置变量无须资源释放操作,仅需要回收内存空间,因此程序结束后全局内存空间被一起回收,不存在变量依赖问题,没有任何代码会再被执行! C++引入了对象,这给全局变量的管理带领原创 2009-07-31 20:45:00 · 1682 阅读 · 0 评论 -
[C++再学习系列] 跨编译单元的对象初始化
跨编译单元的对象初始化C++对跨编译单元的名字空间级对象初始化顺序并未做定义。不仅如此,在调用对象自身的构造函数之前,编译器已经对名字空间级对象做了”零初始化”,即将内存值全部置零(不同于未初始化)。因此,绝对不能假定名字空间级对象的初始化顺序,更不能让名字空间级对象的初始化过程互相依赖。编译单原创 2009-07-31 21:07:00 · 1374 阅读 · 0 评论 -
[C++再学习系列] 异常安全性
异常安全性异常安全保证有3种:(a) 基本保证:保证不会发生资源泄露,即使操作失败;但是状态可能发生改变。(b) 强保证:事务提交/回滚语义。即使操作失败也不会导致程序状态改变。(c) 无失败保证:不允许失败发生。即绝对不会抛异常。 准则:函数应该总是支持它所能支持的最强的异常安全保证,但是前提是不能给那些并不需要原创 2009-08-11 20:33:00 · 1501 阅读 · 0 评论 -
[C++再学习系列] 函数声明与STL容器构造
C++有一条通用规则——几乎任何东西都可能被分析成函数声明。而且函数声明存在多种形式。示例:1.声明一个函数f带有一个double参数而且返回int。下面三种形式是相同的:int f(double d); int f(double (d)); // 同上;名为原创 2009-08-23 11:55:00 · 848 阅读 · 0 评论 -
[C++再学习系列] typename和依赖类型
templateclass Widget { ... };class和typename均可用于声明模板的形式类型参数,但typename能更清楚地表示:T可以是任何类型;不必是一个类。为了避免潜在的模糊解析,编译器要求在依赖形式类型参数的类型名字之前使用typename。这样原创 2009-08-23 11:33:00 · 742 阅读 · 0 评论 -
[C++再学习系列] STL容器删除操作总结
由于容器所对应不同的迭代器、指针和引用的失效规则,使得容器的删除操作较为复杂。解决问题的最好方法取决于你是怎样鉴别出哪个对象是要被去掉的,储存它们的容器的类型,和当你删除它们的时候你还想要做什么(如果有的话)。为此分3种情况讨论:去除一个容器中有特定值的所有对象:1) 如果容器是vector、strin原创 2009-08-23 12:07:00 · 1944 阅读 · 0 评论 -
[C++再学习系列] Using声明和指令的工作原理
对于C++编译器,那么名字可见是至关重要的,太过的名字可见将导致名字查找效率的降低,而名字太少将导致无法找到所需类型或函数的名字,从而导致编译错误。除了最常用的include可以导入可见名字之外,using关键字也可以导入名字到特定的编译单元中(单个cpp文件)。 区别:Using声明: usingnamespace std;Using指令: using N原创 2009-06-25 23:22:00 · 1239 阅读 · 0 评论 -
[C++再学习系列] C++编译器的函数编译流程
Normal 0 7.8 磅 0 2 false false false MicrosoftInternetExplorer4 <!-- /* Sty原创 2009-06-25 22:49:00 · 968 阅读 · 0 评论 -
变量与声明时初始化
对于任何内存空间,均可使用memset() 进行初始化,常见为清零。虽然memset很快,是否有办法使这个过程更快呢?答案是有的。采用变量的声明时初始化。变量的声明时初始化是由编译器完成的,故能使运行时更快!此博文给出一份代码,介绍各种情况下的变量声明初始化,包括new生成的内存区初始化!原创 2010-07-30 17:54:00 · 1375 阅读 · 0 评论