
C++语言&面向对象
Dave888Zhou
大处着眼,小处着手;群居守口,独居守心。
展开
-
JackZhou的负责任书评:C++ Primer中文版(第4版)
C++ Primer中文版(第4版)书评 (1)优点:作为最经典的一本C++入门书籍,其最大的优点就是内容全面,遵循标准,讲解细致。C++语言的所有基础知识在这里都可以一览无余。在作者极其细腻的笔法下,C++这头猛虎变得不再可怕。书中不仅教你C++语法,也教你怎么写程序(当然只是初级的层次)。很早就引入C++标准库是书中的一大特色,也许刚开始作为初学者会觉得有点失措(注意原创 2009-06-09 22:44:00 · 11783 阅读 · 3 评论 -
我的C++实践(8):表达式模板技术
表达式模板技术主要是为了提高存放数值的容器型对象的计算效率。对效率效率要求苛刻(比如大量的数值计算)的计算,使用表达式模板技术可以获得很高的效率,而且客户端的使用代码并没有什么变化,仍然非常紧凑。先看一个简单数组容器模板的实现://sarray.hpp:简单的数组容器类型实现#ifndef SARRAY_HPP#define SARRAY_HPP#include #in原创 2009-09-03 10:44:00 · 1436 阅读 · 1 评论 -
我的C++实践(9):一个完整的类型区分框架
(1)辨别基本类型:IsFundaT及MK_FUNDA_TYPE(T)。 独特构造:基本类型都是已知的,并且个数有限,因此直接用特化来实现。定义一个基本模板表示非基本类型,然后结合宏MK_FUNDA_TYPE(T)来对各个基本类型提供特化,以表示它们是基本类型,用宏主要是为了使代码更简洁。//isfundat.hpp:辨别基本类型#ifndef IS_FUNDAT_HPP原创 2009-09-03 12:52:00 · 1527 阅读 · 0 评论 -
我的C++实践(10):智能指针
1、独占型智能指针:HolderPtr。智能指针对象独占被管理对象的所有权,不允许对智能指针进行拷贝和赋值。可以提供一个release()函数来让出所有权。//holderptr.hpp:独占型智能指针,不允许复制和赋值的智能指针#ifndef HOLDERPTR_HPP#define HOLDERPTR_HPPtemplateclass HolderPtr{p原创 2009-09-08 14:30:00 · 2784 阅读 · 0 评论 -
const char* str1="abcd"与char* str2="abcd"的区别
这是优快云论坛上一个讨论贴,觉得比较好,总结一下。 const char* str1="abcd"与char* str2="abcd"的区别:(1)第一个在修改某个字符的时候会在编译时报错;第二个是在运行时报错(一般说来,不是绝对)。前者是一种良好的编程习惯。(2)编译时str1[2] = 1是非法的,str2[2] = 1是合法的(在运行时会报错)。这种所谓的合原创 2009-07-06 15:05:00 · 3403 阅读 · 2 评论 -
我的C++实践(11):存放异类对象的元组类型
C++中的数组类型和容器类型都是存放同类型对象的,有一个标准库类型std::pair可以存放两个异类对象。借助模板,我们可以开发出存放异类对象的类型。 1、二元组类型:Duo。存放两个异类对象的元组类型,类似于std::pair。设置和获取各个域的操作直接为Duo的成员函数。make_duo函数用来方便地创建二元组对象,类似于make_pair。//duo.hpp:存放两原创 2009-09-10 12:35:00 · 1941 阅读 · 0 评论 -
我的C++实践(12):函数指针与仿函数
C++的函数调用语法实体有函数、类似于函数的宏、函数指针、仿函数(即函数对象)。函数调用的方式有: (1)直接调用:通过函数名直接调用函数,函数起始地址成为指令的一部分,因此编译期就能确定调用了哪个函数。 (2)间接调用:通过函数指针来调用函数,函数起始地址位于内存或寄存器的某处,因此到运行期才能确定调用哪个函数。 (3)内联调用:直接在调用处展开函数代码,在原创 2009-09-12 12:33:00 · 3117 阅读 · 2 评论 -
我的C++实践(13):多态化的构造函数和非成员函数
我们知道构造函数和非成员函数函数不可能是虚函数,但有时候当我们使用一个继承体系时,又希望这些函数具有多态行为,能根据基类指针(或引用)自动地使用子类的实现。其实,通过一些设计技术,我们可以达到这样的目的。 1、虚构造函数:完成对象的创建,并返回基类指针的函数。它的功能就是创建对象,但具有了多态行为,这种虚构造函数有很多的应用。 设想写一个时事通讯(newslette原创 2009-09-14 12:29:00 · 1593 阅读 · 0 评论 -
我的C++实践(14):限制类对象的个数
1、允许一个或零个对象:把所有的构造函数声明为私有,则不能创建任何对象。如果允许只创建一个对象,可用一个全局函数(或静态成员函数)来创建唯一的一个静态对象,并返回其引用,为提高效率,可把全局函数声明为inline。注意这个全局函数要声明为类的友元函数,因为要使用私有的构造函数。 例如我们想创建一个打印机对象,但希望实际上只有一个打印机,可以这样写://printer.hp原创 2009-09-15 18:37:00 · 2447 阅读 · 0 评论 -
我的C++实践(16):引用计数实现
我们在做设计时,将接口与实现相分离是一个基本的策略。分离接口与实现主要有两种技术: (1)抽象基类。这个大家比较熟悉,在C++中是声明了纯虚函数的类,在Java、C#等语言中有现成的关键字。设计时将接口部分放在abstract base class中,它们是一个virtual析构函数和一组pure virtual函数。实现部分由各子类担当。这种类称为Interface Class原创 2009-09-18 15:50:00 · 8425 阅读 · 2 评论 -
我的C++实践(17):代理类技术
代理类其实就是代理模式的应用。Proxy模式为其他对象提供一种代理以控制这个对象的访问。在面向对象系统中,有些对象由于某些原因(比如对象创建开销很大,或者某些操作需要安全控制,或者需要进程外的访问),直接访问会给使用者或者系统结构带来很多麻烦,我们可以在访问此对象时加上一个对此对象的访问层,这个访问层也叫代理。Proxy模式是最常见的模式,在我们生活中处处可见。 1、实现二维数组原创 2009-09-19 13:30:00 · 2043 阅读 · 0 评论 -
我的C++实践(18):多态的双重分派实现
一般的多态是单重分派,即一个基类指针(或引用)直接到绑定到某一个子类对象上去,以获得多态行为。在前面“多态化的构造函数和非成员函数”介绍中,非成员函数函数operator 但很多时候我们需要双重分派或多重分派。比如有一个外太空天体碰撞的视频游戏软件,涉及到宇宙飞船SapceShip、太空站SpaceStation、小行星Asteroid,它们都继承自GameObject。当天体碰原创 2009-09-22 16:02:00 · 3371 阅读 · 3 评论 -
搭建Eclipse C/C++开发环境
搭建eclipse C/C++开发环境: 1、下载并安装Eclipse for C++:http://www.eclipse.org。最新版是基于Eclipse 3.5 galileo,文件名为eclipse-cpp-galileo-SR1-win32.zip。设工作目录为D:/workspace_cpp。 2、eclipse for C/C++ IDE没有包含C/C+原创 2010-01-28 23:07:00 · 12568 阅读 · 1 评论 -
C++ Primer学习系列(7):标准库名字和头文件/算法简介/再谈IO库
附录A.1标准库名字和头文件 本书中用到的标准库名字及其头文件: : abort, : accumulate, inner_product, : allocator, auto_ptr, uninitialized_copy, : back_inserter, f原创 2009-06-28 21:19:00 · 1495 阅读 · 0 评论 -
C++ Primer学习心得和遇到的问题
学习心得: 我学习C++ Primer是在Ubuntu8.04下进行的。经过一个多月的学习,我硬是把vi给用熟了,包括选项设置、文本编辑、多窗口编辑等,对gcc的选项和使用也有了全面的了解。其实vi的功能非常强大,可以设置C/C++代码的缩进格式,也可以用ctag进行代码的导航,而gcc就更不用说了,不仅可以编译多种语言的程序,而且还支持交叉编译。我建议大家在学习标准C++时,最好用原始原创 2009-06-30 22:03:00 · 1717 阅读 · 1 评论 -
我的C++实践(7):模板元编程实战
(1)计算整数的幂。//pow.hpp:计算N的M次幂#ifndef POW_HPP#define POW_HPPtemplateclass Pow{ //计算N的M次方的基本模板public: enum{ result=N*Pow::result };};templateclass Pow{ //用于结束递归的局部特化public: enu原创 2009-09-01 20:08:00 · 1978 阅读 · 0 评论 -
我的C++实践(1):Stack的实现
(1)基本的Stack:以std::deque为内部容器。方法有入栈、出栈、返回栈顶元、判断栈空。//stack1.h:栈的基本实现#ifndef __STACK1_H__#define __STACK1_H__#include #include templateclass Stack{private: std::deque elems; //包含元素的容原创 2009-08-17 20:07:00 · 3365 阅读 · 2 评论 -
C++ Primer学习系列(1):快速入门/变量和基本类型/标准库类型
序: 为再复习一下以前的学习内容,也为了不断地提高自己,我决定把以前的学习笔记整理出来汇成一个系列,使自己形成一个知识体系。整个系列大概有7到8个部分,每个部分一般有3章的内容。笔记中有的是书中重点内容的重新再现(我用了精简而又易于理解的语言来描述),有的是我自己的理解(不一定完全正确,希望大家多多指教),有的是我作的总结。学习时只有不断地总结才会把书读薄,才会有质的提高,这是原创 2009-06-20 21:30:00 · 1906 阅读 · 0 评论 -
我的C++实践(2):模板代码的测试
C++中的模板产生类代码的过程非常复杂,而模板所表示的泛型代码还要依赖于使用模板的客户端。比如模板本身的位置、使用模板的位置、定义模板实参的位置等都会对模板的实例化产生影响。因此,模板代码的测试和调试都比较难。跟踪程序(tracer)就是一种可以跟踪模板实际调用步骤的程序,它通常是一个用户自定义的类,只定义了满足模板测试的一些功能。类的每个操作中都有一个针对该操作的跟踪(比如递增一个计数原创 2009-08-21 14:17:00 · 2013 阅读 · 1 评论 -
我的C++实践(3):用多态机制来做设计
多态polymorphism是指具有多种形态的情况,它能根据单一的标记关联不同的行为。多态是面向对象程序设计的基础。在面向对象程序设计中的多态是一种运行时的多态。C++中有两种多态,称为动多态(运行时多态)和静多态(编译时多态),而静多态主要通过模板来实现,宏也是实现静多态的一种途径。其实在做软件设计时静多态的威力也是非常强大的,只不过我们经常对它疏忽了而已。 动多态的设计思想:原创 2009-08-23 20:01:00 · 1908 阅读 · 1 评论 -
C++ Primer学习系列(2):数组和指针/表达式/语句
第4章数组和指针 4.1 数组的类型:可以是内置类型或类类型;除引用之外,数组元素的类型还可以是任意的复合类型。没有所有元素都是引用的数组。 数组的维数:只能是编译期即能确定值的常量表达式,包括整型常量、枚举常量或者用常量表达式初始化的整型const对象。 字符串常量:为了与C兼容,C++中原创 2009-06-21 12:45:00 · 1486 阅读 · 0 评论 -
C++ Primer学习系列(3):函数/标准IO库/顺序容器
第7章函数 7.1 函数调用操作符():操作数是函数名和一组(可能为空)由逗号分隔的实参 实参必须具有与形参类型相同、或者能隐式转换为形参类型的数据类型 函数的返回类型:可以是内置类型、类类型、复合类型(如引用或指针)、void类型(不返回任何值);函数不能返回另一个函数或者内置数组类原创 2009-06-22 20:26:00 · 1392 阅读 · 0 评论 -
我的C++实践(5):类型萃取技术
C++模板中的类型参数T是抽象的,我们并不能在模板内部直接获得它的具体特征。类型萃取(抽取)技术就是要抽取类型的一些具体特征(trait),比如它是哪种具体类型,它是引用类型,内建类型,还是类类型等。可见,类型萃取技术其实就是trait模板技术的具体体现。获取类型的具体特征在Java、C#等语言中也称为反射(reflection),C++中通过模板技术也可以实现一定的反射行为。 类型原创 2009-08-26 19:27:00 · 5914 阅读 · 0 评论 -
我的C++实践(4):trait与policy模板技术
我们知道,类有属性(即数据)和操作两个方面。同样模板也有自己的属性(特别是模板参数类型的一些具体特征,即trait)和算法策略(policy,即模板内部的操作逻辑)。模板是对有共性的各种类型进行参数化后的一种通用代码,但不同的具体类型又可能会有一些差异,比如不同的类型可能会有自己的不同特征和算法实现策略。trait模板和policy模板技术就是把模板的trait和policy这两个针对不同原创 2009-08-26 13:57:00 · 5180 阅读 · 0 评论 -
C++ Primer学习系列(5):复制控制/重载操作与转换/面向对象编程
第13章复制控制 复制控制:复制构造函数、赋值操作、析构函数不显式给出时,编译器会自动定义 定义一个新对象并用一个同类型的对象对它进行初始化时,将显式使用复制构造函数;将该类型的对象传递给函数或从函数返回该类型的对象时,隐式使用复制构造函数 定义两个对象,将一个对象赋值给另一个对象时使用赋值操作符原创 2009-06-24 13:31:00 · 1439 阅读 · 0 评论 -
C++ Primer学习系列(6):模板与泛型编程/用于大型程序的工具/特殊工具与技术
<!-- @page { size: 21.59cm 27.94cm; margin: 2cm } P { margin-bottom: 0.21cm } -->第16章模板与泛型编程 16.1 函数模板:模板形参表不能为空。模板形参可以是类型形参,跟在class或typename后面;原创 2009-06-26 14:56:00 · 1508 阅读 · 0 评论 -
C++ Primer学习系列(4):关联容器/泛型算法/类
<!-- @page { size: 21.59cm 27.94cm; margin: 2cm } P { margin-bottom: 0.21cm } -->第10章关联容器 关联容器:map,set, multimap, multiset 10.1 pair类型:在原创 2009-06-23 13:17:00 · 1679 阅读 · 0 评论 -
我的C++实践(6):模板与继承相结合的威力
模板表示类的集合,让模板继承一个类与面向对象编程中的继承并没有本质的差别。但是在模板中使用继承有一些特别的地方,比如基类可以依赖于模板参数(例如继承B,这称为依赖型基类)、甚至模板参数直接可以作为基类,这些所谓的参数化继承,再结合多重继承等C++中特有的继承机制,我们可以发挥模板和继承各自的优势,产生出很多的有趣的技术。 1、命名模板参数。C++中当多个模板参数有缺省实参时,原创 2009-08-31 15:56:00 · 3365 阅读 · 1 评论 -
C++语言的黑客行为
在C++中,利用C++编译器在实现虚函数调用时的某些伎俩,我们可以在类外直接调用到类的私有成员函数!!代码如下,代码中有详细的说明。//hacker.cpp: C++语言的黑客行为#include class Coo{private: int d; //特意将d放在最前面,但实际上Coo类的对象内存中 //在d前面还有一个指向vtable数组的原创 2010-04-11 21:32:00 · 4102 阅读 · 10 评论