随笔分类 -  C++

摘要:概述:成员指针只应用于类的非 static 成员。static 类成员不是任何对象的组成部分,所以不需要特殊语法来指向 static 成员,static 成员指针是普通指针。 一.定义数据成员的指针 1.对于类 class Screen { public: typedef std::string::size_type index; ... 阅读全文
posted @ 2012-08-31 17:28 ForFreeDom 阅读(459) 评论(0) 推荐(0)
摘要:一、通过运行时类型识别(RTTI),程序能够使用基类的指针或引用来检索这些指针或引用所指对象的实际派生类型。 通过下面两个操作符提供 RTTI: 1.typeid 操作符,返回指针或引用所指对象的实际类型。 2.dynamic_cast 操作符,将基类类型的指针或引用安全地转换为派生类型的指针或引用。 这些操作符只为带有一个或多个虚函数的类返回动态类型信息,对于其他类型,返回静态(... 阅读全文
posted @ 2012-08-27 14:48 ForFreeDom 阅读(706) 评论(0) 推荐(0)
摘要:一、C++ 中,内存分配和对象构造紧密纠缠,就像对象和内存回收一样。使用 new 表达式的时候,分配内存,并在该内存中构造一个对象:使用 delete 表达式的时候,调用析构函数撤销对象,并将对象所用内存返还给系统。 1.接管内存分配时,必须处理这两个任务。分配原始内存时,必须在该内存中构造对象;在释放该内存之前,必须保证适当地撤销这些对象。 2.对未构造的内存中的对象... 阅读全文
posted @ 2012-08-22 18:14 ForFreeDom 阅读(2835) 评论(0) 推荐(0)
摘要:概述:为什么需要命名空间: 在一个给定作用域中定义的每个名字在该作用域中必须是唯一的,对庞大、复杂的应用程序而言,这个要求可能难以满足。库倾向于定义许多全局名字——主要是模板名、类型名或函数名。在使用来自多个供应商的库编写应用程序的时候,这些名字中有一些几乎不可避免地会发生冲突,这种名字冲突问题称为命名空间污染问题。 命名空间为防止名字冲突提供了更加可控的机制,命名空间能够划分全局命名空间,这样使用独立开发的库就更加容易了。一个命名空间是一个作用域,通过在命名空间内部定义库中的名字,库的作者(以及用户)可以避免全局名字固有的限制.一、命名空间的定义:命名空间定义以关键字 namespace 开 阅读全文
posted @ 2012-08-13 17:33 ForFreeDom 阅读(1437) 评论(0) 推荐(0)
摘要:异常处理概述:通过异常我们能够将问题的检测和问题的解决分离,这样程序的问题检测部分可以不必了解如何处理问题。C++ 的异常处理中,需要由问题检测部分抛出一个对象给处理代码,通过这个对象的类型和内容,两个部分能够就出现了什么错误进行通信。一、抛出类类型的异常: 1.异常是通过抛出对象而引发的。该对象的类型决定应该激活哪个处理代码。被选中的处理代码是调用链中与该对象类型匹配且离抛出异常位置最近的那个。 2.异常以类似于将实参传递给函数的方式抛出和捕获。异常可以是可传给非引用形参的任意类型的对象,这意味着必须能够复制该类型的对象。 3.如果抛出一个数组,被抛出的对象转换为指向数组首元素的指针,类似地 阅读全文
posted @ 2012-08-10 09:55 ForFreeDom 阅读(374) 评论(0) 推荐(0)
摘要:一、类模板成员 1.模板作用域中模板类型的引用: A.在类模板的作用域内部,可以用它的非限定名字引用该类。 B.通常,当使用类模板的名字的时候,必须指定模板形参。这一规则有个例外:在类本身的作用域内部,可以使用类模板的非限定名。例如,在默认构造函数和复制构造函数的声明中,名字 Queue 是 Queue<Type> 缩写表示。... 阅读全文
posted @ 2012-07-23 17:11 ForFreeDom 阅读(1266) 评论(0) 推荐(0)
摘要:概述:所谓泛型编程就是以独立于任何特定类型的方式编写代码。使用泛型程序时,我们需要提供具体程序实例所操作的类型或值。第二部分中描述的标准库的容器、迭代器和算法都是泛型编程的例子。在 C++ 中,模板是泛型编程的基础。模板是创建类或函数的蓝图或公式。 一 、模板定义 1.定义函数模板: compare 的模板版本: // implem... 阅读全文
posted @ 2012-07-17 18:18 ForFreeDom 阅读(8528) 评论(0) 推荐(0)
摘要:一、继承情况下的类作用域 1.每个类都保持着自己的作用域,在该作用域中定义了成员的名字。在继承情况下,派生类的作用域嵌套在基类作用域中。如果不能在派生类作用域中确定名字,就在外围基类作用域中查找该名字的定义。正是这种类作用域的层次嵌套使我们能够直接访问基类的成员,就好象这些成员是派生类成员一样。 2.名字查找在编译时发生:对象、引用或指针的静态类型决... 阅读全文
posted @ 2012-07-07 16:00 ForFreeDom 阅读(459) 评论(0) 推荐(0)
摘要:一、概述:面向对象编程基于三个基本概念:数据抽象、继承和动态绑定。在 C++ 中,用类进行数据抽象,用类派生从一个类继承另一个:派生类继承基类的成员。动态绑定使编译器能够在运行时决定是使用基类中定义的函数还是派生类中定义的函数。 1.通过继承我们能够定义这样的类,它们对类型之间的关系建模,共享公共的东西,仅仅特化本质上不同的东西。 2.我们经常称因继承而相关联的类为构成了一个继承层次。其中有一个类称为根,所以其他类直接或间接继承根类。 3.在 C++ 中,基类必须指出希望派生类重写哪些函数,定义为 virtual 的函数是基类期待派生类重新定义的,基类希望派生类继承的函数不能定义为虚函数。 4 阅读全文
posted @ 2012-06-27 09:51 ForFreeDom 阅读(509) 评论(0) 推荐(0)
摘要:这里并没不是讨论大学课程中所学的《编译原理》,只是写一些我自己对C++编译器及链接器的工作原理的理解和看法吧,以我的水平,还达不到讲解编译原理(这个很复杂,大学时几乎没学明白)。 要明白的几个概念: 1、编译:编译器对源文件进行编译,就是把源文件中的文本形式存在的源代码翻译成机器语言形式的目标文件的过程,在这个过程中,编译器会进行一系列的语法检查。如果编译通过,就会把对应的CPP转换成OBJ文... 阅读全文
posted @ 2012-06-19 18:03 ForFreeDom 阅读(597) 评论(1) 推荐(1)
摘要:一、预备知识—程序的内存分配 一个由c/C++编译的程序占用的内存分为以下几个部分 1、栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。 2、堆区(heap) — 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收 。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表,呵呵。 3、全局区... 阅读全文
posted @ 2012-05-27 23:06 ForFreeDom 阅读(518) 评论(0) 推荐(0)
摘要:命名约定 有不少人编程时用拼音给函数或变量命名,这样做并不能说明你很爱国,却会让用此程序的人迷糊(很多南方人不懂拼音,我就不懂)。程序中的英文一般不会太复杂,用词要力求准确。匈牙利命名法是Microsoft 公司倡导的[Maguire 1993],虽然很烦琐,但用习惯了也就成了自然。没有人强迫你采用何种命名法,但有一点应该做到:自己的程序命名必须一致。 以下是我编程时采用的命名约定: (1)... 阅读全文
posted @ 2012-05-25 22:49 ForFreeDom 阅读(217) 评论(0) 推荐(0)
摘要:问:我想比较两个浮点型变量,应该怎么比较? 答:大于、小于直接比较啊。 等于最好这样: const float E = 1e-6; float f1 , f2; //…… if(fabs(f1- f2) < E) {……}---------------------------------------... 阅读全文
posted @ 2012-05-24 11:38 ForFreeDom 阅读(1360) 评论(0) 推荐(1)
摘要:复制构造函数、赋值操作符和析构函数总称为复制控制。编译器自动实现这些操作,但类也可以定义自己的版本。 一、概述: 每种类型,无论是内置类型还是类类型,都对该类型对象的一组(可能为空的)操作的含义进行了定义。比如,我们可以将两个 int 值相加,运行 vector 对象的 size 操作,等等。这些操作定义了用给定类型的对象可以完成什么任务。 当定义一个新类型的时候,需要显式或隐式地指定复制、... 阅读全文
posted @ 2012-05-21 10:18 ForFreeDom 阅读(394) 评论(0) 推荐(0)
摘要:每一种语言,其变量、函数、或者对象、指针等都有其生存期,也就是作用域。这个是语言自身的最基本的一个知识,以C++为例子,说明作用域的范围: typedef string Type; Type initVal( ); class Exercise { public: typedef double Type; Type se... 阅读全文
posted @ 2012-05-16 17:16 ForFreeDom 阅读(609) 评论(0) 推荐(0)
摘要:书上和网上在很多地方都对const 的重载做了一些解释,但感觉都不是很详细。还有很多同学在不同的地方发问关于const 重载的问题,这里我又重新看了一下,做了一个简单的分析也可能有不对的地方,欢迎讨论。 所谓重载,是指允许存在多个同名函数,而这些函数的参数表不同,即函数名相同但函数的签名不同。重载并不是面向对象编程的特有属性,这是因为重载是在编译阶段实现的,编译器根据函数不同的参数表,对同名... 阅读全文
posted @ 2012-05-15 11:39 ForFreeDom 阅读(359) 评论(0) 推荐(0)
摘要:一、概述:类类型常被称为抽象数据类型(abstract data types)。抽象数据类型将数据(即状态)和作用于状态的操作视为一个单元。我们可以抽象地考虑类该做什么,而无须知道类如何去完成这些操作。通过类我们能够将实现和接口分离,用接口指定类所支持的操作,而实现的细节只需类的实现者了解或关心。抽象数据类型是面向对象编程和泛型编程的基础。它们用起来与内置类型一样容易和直观。 1.最简单地说,类... 阅读全文
posted @ 2012-05-13 15:34 ForFreeDom 阅读(981) 评论(0) 推荐(0)
摘要:(1)分配内存 设有定义字符型指针变量与字符数组的语句如下: char *pc ,str[100]; 则系统将为字符数组str分配100个字节的内存单元,用于存放100个字符。而系统只为指针变量pc分配4个存储单元,用于存放一个内存单元的地址。 (2)初始化赋值含义 字符数组与字符指针变量的初始化赋值形式相同,但其含义不同。例如:... 阅读全文
posted @ 2012-05-12 09:08 ForFreeDom 阅读(565) 评论(0) 推荐(0)
摘要:iostream.h为非法的输入输出流,.h的头文件是C语言格式的,由于当时还没有命名空间这个说法,所以也就不存在std这个命名空间标示符。所以用iostream.h也就用不着std或者using namespace std. iostream为标准输入输出流,它是C++规范的带有命名空间的头文件,它包含在std命名空间内。 iostream流包含cin和cout输入输出流,使用... 阅读全文
posted @ 2012-05-11 16:00 ForFreeDom 阅读(483) 评论(0) 推荐(0)
摘要:1.一些成员函数改变对象,一些成员函数不改变对象. 2.为了使成员函数的意义更加清楚,我们可在不改变对象的成员函数的函数原型中加上const说明: class Point { public: int GetX() const; int GetY() const; void SetPt (int, int); void OffsetPt (int, int); priva... 阅读全文
posted @ 2012-05-07 18:00 ForFreeDom 阅读(584) 评论(0) 推荐(1)