代码改变世界

随笔分类 -  C/C++

[C++再学习系列] 深入new/delete:Operator new的全局重载

2011-01-13 12:01 by zhenjing, 1542 阅读, 收藏, 编辑
摘要: 我们经常看到这么一句话:operator new可以重载,placement new不可重载。其实此处所说的不可重载应该是指全局的placement new不可重载,对于类域中的placement new是可以重载的。重载operator new规则:重载operator new 的参数个数是可以任意的, 只需要保证第一个参数为 size_t, 返回类型为 void * 即可, 而且其重载的参数类型也不必包含自定义类型. 更一般的说, operator new 的重载更像是一个函数的重载, 而不是一个操作符的重载。 阅读全文

[C++再学习系列] 深入new/delete:New的3种形态

2011-01-10 10:59 by zhenjing, 2193 阅读, 收藏, 编辑
摘要: 短文介绍了New的3种形态: new operator 、 operator new 、 placement new。介绍了每一个种new背后的行为以及之间的区别,使用new的基本指南。同时给出placement new的基本使用准测。最后介绍如何使用new handler来定制new失败后的程序行为。 阅读全文

[C++再学习系列] 派生类函数的重实现规则(override-覆盖)

2010-12-02 12:00 by zhenjing, 2180 阅读, 收藏, 编辑
摘要: C++有重载(Overload),虚函数的重实现(override-覆盖),隐藏(Overwrite:覆盖hide)。这三者初学者容易混淆。其中重载最容易掌握,重实现也不容易出错,而已隐藏规则最为诡异,但其实隐藏完全就是C++的名字查找问题,明白名称查找规则后,一切就豁然了,不用再去记各种隐藏规则了。 阅读全文

[C++再学习系列] 虚函数的4条规则

2010-11-30 11:58 by zhenjing, 1512 阅读, 收藏, 编辑
摘要: 虚函数的4条规则:1 尽量使用非虚拟接口模式 (NVI) 让接口函数成为非虚拟的。2 尽量让虚函数成为私用的。3 只有当派生类需要调用基类对某个虚函数的实现时,才把虚函数声明为保护的。4 基类的析构函数应该要么为共有虚函数 , 要么为保护虚函数。 阅读全文

[C++再学习系列] 隐式类型转换与转换操作符

2010-11-26 13:06 by zhenjing, 1481 阅读, 收藏, 编辑
摘要: C++标准允许隐式类型转换,即对特定的类,在特定条件下,某些参数或变量将隐形转换成类对象(创建临时对象)。如果这种转换代价很大(调用类的构造函数),隐式转换将影响性能。隐式转换的发生条件:函数调用中,当参数类型不匹配,如果隐式转换后能满足类型匹配条件,编译器将启用类型转换。控制隐式类型转换的两种途径:1) 减少函数调用的参数不匹配情况:提供签名(函数参数类型)与常见参数类型的精确匹配的重载函数。2) 限制编译器的启用隐式转换:使用explicit限制的构造函数和具名转换函数。 阅读全文

[C++再学习系列] 二元操作符重载

2010-11-24 12:48 by zhenjing, 1227 阅读, 收藏, 编辑
摘要: 二元操作符重载的具体实现的标准方法如下:T& T::operator@=( const T& ) { // … implementation … return *this;}T operator@( const T& lhs, const T& rhs ) { T temp( lhs ) return temp @= rhs;} 阅读全文

[C++再学习系列] 前置++与后置++

2010-11-18 18:03 by zhenjing, 917 阅读, 收藏, 编辑
摘要: 前置++与后置++听起来确实很简单,但如果动手写,估计自己是无法一次写出正确的版本的。 阅读全文

[C++再学习系列] 指针和引用

2010-11-12 17:57 by zhenjing, 1490 阅读, 收藏, 编辑
摘要: 在指针和引用的小文中,主要讨论了引用和指针语法层面上的区别。本文将侧重如何更加合理地利用语言对引用所作限制。 阅读全文

[C++再学习系列] 引用和指针

2010-11-09 13:18 by zhenjing, 3094 阅读, 收藏, 编辑
摘要: 引用和指针有如下三种区别: 1 引用必须在声明时初始化,而指针不用; 2 对于NULL不能引用,而指针可以指向NULL; 3 引用一旦声明,引用的对象不能改变(但对象的值可以改变);而指针可以随时改变指向的对象。 引用能做到的,指针也可以,但指针更危险; (1)引用被创建的同时必须被初始化(指针则可以在任何时候被初始化)。(2)不能有NULL引用,引用必须与合法的存储单元关联(指针则可以是 NULL)。(3)一旦引用被初始化,就不能改变引用的关系(指针则可以随时改变所指的对象)。本文将更深入地讨论这3个区别背后的意义。 阅读全文

[C++再学习系列] Using声明和指令的工作原理

2010-11-04 12:01 by zhenjing, 2340 阅读, 收藏, 编辑
摘要: 对于C++编译器,那些名字可见是至关重要的,太多的名字可见将导致名字查找效率的降低。除了最常用的include可以导入可见名字之外,using关键字也可以导入名字到特定的编译单元中(单个cpp文件)。 本文将阐述using关键字的工作原理和使用准则。 阅读全文

[C++再学习系列] 可访问性问题

2010-11-03 13:15 by zhenjing, 502 阅读, 收藏, 编辑
摘要: C++通过Private,protected,public来控制成员的可访问性。本文将讨论如何改变类函数的可访问性,以及如何突破类函数的可访问性限制。 阅读全文

初学者:C++学习

2010-11-01 09:17 by zhenjing, 2384 阅读, 收藏, 编辑
摘要: 这份笔记是分多次写成的。开始部分是当初学习C++的笔记。06年7月之前,做嵌入式开发的,比如单片机,DSP等,在7月14号最终确定彻底转向计算机方向,并分到一个项目组(学校),做流媒体服务器开发。之前开发汇编用得多,C懂点,C++根本不懂。开始的第一天拿到上千行的C++代码,彻底晕了,根本看不懂。于是接下来3天,看了 这本书,并写下了最初的这份笔记。后面的2周内,写出了3000多行的C++项目代码,虽然有bug,但这份经历对我影响很大。那些天每天工作都在12小时以上,眼睛都看花了。这份笔记对自己早已没多大价值,但这份经历却让我印象深刻。希望这些笔记对初学者能有所帮助! 阅读全文

对待拷贝构造函数和赋值函数的3种境界

2010-10-29 11:53 by zhenjing, 2709 阅读, 收藏, 编辑
摘要: 对待拷贝构造函数和赋值函数有3种境界:不写;禁用;正确编写。具体细节详见正文,文中另外给出一些有关拷贝构造函数的语法细节,笔试有用吧,平时用不到。 阅读全文

C++析构函数不能失败的4个理由

2010-10-25 09:45 by zhenjing, 3001 阅读, 收藏, 编辑
摘要: C++的析构函数不能失败,即抛出异常(析构函数没有返回值)。但为什么不能失败呢?理由又是什么呢?假如面试被问到这个问题,您能说出几个理由呢? 阅读全文

[C++再学习系列] 类常量

2010-10-22 09:35 by zhenjing, 499 阅读, 收藏, 编辑
摘要: C++标准允许在类的定义中定义静态整数常量,但其他类型的类常量则需要单独的定义或将常量封装在函数中。此外,enum也常用于定于类常量。对于单独的类常量,static声明是必须的,这样才能保证所有的类常量公用一个地址空间。 阅读全文

[C++再学习系列] 跨编译单元的对象初始化

2010-10-21 22:06 by zhenjing, 926 阅读, 收藏, 编辑
摘要: C++对跨编译单元的名字空间级对象初始化顺序并未做定义。不仅如此,在调用对象自身的构造函数之前,编译器已经对名字空间级对象做了”零初始化”,即将内存值全部置零(不同于未初始化)。因此,绝对不能假定名字空间级对象的初始化顺序,更不能让名字空间级对象的初始化过程互相依赖。 阅读全文

揭秘:C++编译器的函数编译流程

2010-10-20 09:35 by zhenjing, 5129 阅读, 收藏, 编辑
摘要: 介绍C++编译器在解析函数调用所涉及的三大步骤(流程):a)名字查找;b)重载决议;c)可访问性检查。了解编译器的工作流程有助于解释很多编译器的编译错误,并防止写出无法通过编译的代码。如能真正理解这些规则,很多C++编译错误就很容易解释了。 阅读全文

[C++再学习系列] 全局或静态变量(对象)的初始化

2010-10-15 13:11 by zhenjing, 4905 阅读, 收藏, 编辑
摘要: 对于C语言的全局和静态变量,不管是否被初始化,其内存空间都是全局的;如果初始化,那么初始化发生在任何代码执行之前,属于编译期初始化。由于内置变量无须资源释放操作,仅需要回收内存空间,因此程序结束后全局内存空间被一起回收,不存在变量依赖问题,没有任何代码会再被执行! C++引入了对象,这给全局变量的管理带领新的麻烦。C++的对象必须有构造函数生成,并最终执行析构操作。由于构造和析构并非分配内存那么简单,可以相当复杂,因此何时执行全局或静态对象(C++)的构造和析构呢?这需要执行相关代码,无法在编译期完成,因此C++标准规定:全局或静态对象当且仅当对象首次用到时才进行构造,并通过atexit()来管理对象的生命期,在程序结束之后(如调用exit,main),按FILO顺序调用相应的析构操作! 阅读全文

[C++再学习系列] 具有链接的C++实体

2010-10-14 17:32 by zhenjing, 540 阅读, 收藏, 编辑
摘要: 具有链接的实体,包括名字空间级的变量和函数,都是需要分配内存的。具有链接的实体如果在源文件(cpp)中出现多次,将意味着多次分配内存,每个内存空间定义一个特定的实体。这会导致:1) 空间膨胀;2) 出现多个变量,变量的状态不共享。 个人理解:何为具有链接的实体呢?通常而言,变量和函数的定义即是。 阅读全文

[C++再学习系列] 变量的声明、定义与extern关键字

2010-10-12 13:14 by zhenjing, 1224 阅读, 收藏, 编辑
摘要: A definition of a variable allocates storage for the variable and may also specify an initial value for the variable. There must be one and only one definition of a variable in a program. A declaration makes known the type and name of the variable to the program. A definition is also a declaration: When we define a variable, we declare its name and type. We can declare a name without defining it by using the extern keyword. A declaration that is not also a definition consists of the object's 阅读全文
点击右上角即可分享
微信分享提示