C++学习第二十四步:C++ 标准函数库C++ Standard Library

发表时间:2010-07-22 08:11:26 文章分类:C/C++ 阅读:103418
文件的输入输出 (Input/Output with files)C++ 通过以下几个类支持文件的输入输出:    ofstream: 写操作(输出)的文件类 (由ostream引申而来)        ifstream: 读操作(输入)的文件类(由istream引申而来)        fstream: 可同时读写操作的文件类 (由iostream引申而来)    [separator]打开文件(Open a file)对这些类的一个对象所做的第一个操作通常就是将它和一个真正的文件联系起来,也就是说打开一个文件。被打开的文件在程序中由一个流对象(stream object)来表示 (这些类的一个实例) ,而对这个流对象所做的任何输入输出操作实际就是对该文件所做的操作。要通过一个流对象打开一个文件,我们使用它的成员函数open():void open (const char * filename, openmode mode);这里filename 是一个字符串,代表要打开的文件名,mode 是以下标志符的一个组合:               &

C++ using namespace std 详解

发表时间:2010-03-10 05:40:06 文章分类:C/C++ 阅读:94810
一 :和是不一样,前者没有后缀,实际上,在你的编译器include文件夹里面可以看到,二者是两个文件,打开文件就会发现,里面的代码是不一样的。后缀为.h的头文件c++标准已经明确提出不支持了,早些的实现将标准库功能定义在全局空间里,声明在带.h后缀的头文件里,c++标准为了和C区别开,也为了正确使用命名空间,规定头文件不使用后缀.h。[separator]因此,当使用时,相当于在c中调用库函数,使用的是全局命名空间,也就是早期的c++实现;当使用的时候,该头文件没有定义全局命名空间,必须使用namespace std;这样才能正确使用cout。二:所谓namespace,是指标识符的各种可见范围。C++标准程序库中的所有标识符都被定义于一个名为std的namespace中。由于namespace的概念,使用C++标准程序库的任何标识符时,可以有三种选择:1、直接指定标识符。例如std::ostream而不是ostream。完整语句如下:std::cout

C++学习第十六步:操作符重载(Overloading operators)

发表时间:2010-03-06 02:58:00 文章分类:C/C++ 阅读:80031
C++ 实现了在类(class)之间使用语言标准操作符,而不只是在基本数据类型之间使用。例如:int a, b, c;a = b + c;是有效操作,因为加号两边的变量都是基本数据类型。然而,我们是否可以进行下面的操作就不是那么显而易见了(它实际上是正确的):[separator]struct { char product [50]; float price; } a, b, c;a = b + c; 将一个类class (或结构struct)的对象赋给另一个同种类型的对象是允许的(通过使用默认的复制构造函数 copy constructor)。但相加操作就有可能产生错误,理论上讲它在非基本数据类型之间是无效的。但归功于C++ 的操作符重载(overload)能力,我们可以完成这个操作。像以上例子中这样的组合类型的对象在C++中可以接受如果没有操作符重载则不能被接受的操作,我们甚至可以修改这些操作符的效果。以下是所有可以被重载的操作符的列表:+ - * / = < > += -= *= /= >= == != = ++ -- % & ^ ! |~ &= ^= |= && || %= [] () new delete要想重载一个操作符,我们只需要编写一个成员函数,名为operator ,后面跟我们要重载的操作符,遵循以下

C++学习第二十二步:类型转换高级 (Advacned Class Type-casting)

发表时间:2010-03-06 02:53:56 文章分类:C/C++ 阅读:92055
目前为止,我们一直使用传统的类型转换符来进行简单对象的类型转换。例如,要把一个double类型的浮点型数字转换为int 的整型数字,我们是这样做的:[separator]int i;double d;i = (int) d; 或者i = int (d);这样做对基本数据类型时没问题的,因为基本数据类型的转换已经有标准的定义。同样的操作也可以被在类或类的指针上,因此以下例子中的写法也是没有问题的: // class type-casting #include class CDummy { int i; }; class CAddition { int x,y; public: CAddition (int a, int b) { x=a; y=b; } int result() { return x+y;} }; int main () { CDummy d; CAddition * padd; padd = (CAddition*) &d; cout result(); re

C++学习第二十三步:预处理指令 (Preprocessor Directives)

发表时间:2010-03-06 02:52:27 文章分类:C/C++ 阅读:114917
预处理指令是我们写在程序代码中的给预处理器(preprocessor)的 命令,而不是程序本身的语句。预处理器在我们编译一个C++程序时由编译器自动执行,它负责控制对程序代码的第一次验证和消化。所有这些指令必须写在单独的一行中,它们不需要加结尾的分号;。[separator]#define在这个教程的开头我们已经提到了一种预处理指令: #define ,可以被用来生成宏定义常量(defined constantants 或 macros),它的形式是:#define name value它的作用是定义一个叫做name 的宏定义,然后每当在程序中遇到这个名字的时候,它就会被value代替,例如:#define MAX_WIDTH 100char str1[MAX_WIDTH];char str2[MAX_WIDTH];它定义了两个最多可以存储100个字符的字符串。#define 也可以被用来定义宏函数:#define getmax(a,b) a>b?a:bint x=5, y;y = getmax(x,2);这段代码执行后y 的值为5 。#undef#undef 完成与 #define相反的工作,它取消对传入的参数的宏定义:#define MAX_WIDTH 100char str1[MAX_WIDTH];#undef MAX_WIDTH#define MAX_WIDTH 200char str2[MAX_WIDTH]; #ifdef, #ifndef, #if, #

C++学习第二十一步:出错处理 (Exception handling)

发表时间:2010-03-06 02:48:18 文章分类:C/C++ 阅读:443575
本节介绍的出错处理是ANSI-C++ 标准引入的新功能。如果你使用的C++ 编译器不兼容这个标准,则你可能无法使用这些功能。[separator]在编程过程中,很多时候我们是无法确定一段代码是否总是能够正常工作的,或者因为程序访问了并不存在的资源,或者由于一些变量超出了预期的范围,等等。这些情况我们统称为出错(例外),C++ 新近引入的三种操作符能够帮助我们处理这些出错情况: try, throw 和 catch 。它们的一般用法是:try { // code to be tried throw exception;}catch (type exception){ // code to be executed in case of exception}它们所进行的操作是:try 语句块中的代码被正常执行。如果有例外发生,代码必须使用关键字throw 和一个参数来扔出一个例外。这个参数可以是任何有效的数据类型,它的类型反映了例外的特征。

C++学习第二十步:名空间 (Namespaces)

发表时间:2010-03-06 02:46:09 文章分类:C/C++ 阅读:79305
通过使用名空间(Namespaces)我们可以将一组全局范围有效的类、对象或函数组织到一个名字下面。换种说法,就是它将全局范围分割成许多子域范围,每个子域范围叫做一个名空间(namespaces).[separator]使用名空间的格式是:namespace identifier{ namespace-body}这里identifier 是一个有效的标示符,namespace-body 是该名空间包含的一组类、对象和函数。例如:namespace general{ int a, b;}在这个例子中,a 和 b 是名空间general中的整型变量。要想在这个名空间外面访问这两个变量,我们必须使用范围操作符::。例如,要想访问前面的两个变量,我们需要这样写:general::ageneral::b 名空间(namespaces)的作用在于全局对象或函数很有可能重名而造成重复定义的错误,名空间的使用可以避免这些错误的发生。例如: // namespaces #include namespace first { int var = 5; } namespac

C++学习第十九步:模板(Templates)

发表时间:2010-03-06 02:43:11 文章分类:C/C++ 阅读:90376
 模板(Templates)是ANSI-C++ 标准中新引入的概念。如果你使用的 C++ 编译器不符合这个标准,则你很可能不能使用模板。[separator]函数模板( Function templates)模板(Templates)使得我们可以生成通用的函数,这些函数能够接受任意数据类型的参数,可返回任意类型的值,而不需要对所有可能的数据类型进行函数重载。这在一定程度上实现了宏(macro)的作用。它们的原型定义可以是下面两种中的任何一个:template function_declaration;template function_declaration; 上面两种原型定义的不同之处在关键字class 或 typename的使用。它们实际是完全等价的,因为两种表达的意思和执行都一模一样。例如,要生成一个模板,返回两个对象中较大的一个,我们可以这样写:template GenericType GetMax (GenericType a, GenericType b) { return (a>b?a:b); }在第一行声明中,我们已经生成了一个通用数据类型的模板,叫做Gene

C++学习第十八步:多态 (Polymorphism)

发表时间:2010-03-06 02:40:00 文章分类:C/C++ 阅读:196023
为了能更好的理解本节内容,你需要清楚的知道怎样使用指针pointers 和类之间的继承 inheritance between classes。建议如果你觉得以下这些表达式比较生疏的的话, 请复习指定的章节:int a::b(c) {}; // 类Classes a->b // 指针和对象pointers and objects class a: public b; // 类之间的关系Relationships between classes[separator]基类的指针(Pointers to base class)继承的好处之一是一个指向子类(derived class)的指针与一个指向基类(base class)的指针是type-compatible的。 本节就是重点介绍如何利用C++的这一重要特性。例如,我们将结合C++的这个功能,重写前面小节中关于长方形rectangle 和三角形 triangle 的程序:// pointers to base clas

C++学习第十七步:类之间的关系(Relationships between classes)

发表时间:2010-03-06 02:00:03 文章分类:C/C++ 阅读:110210
友元函数(Friend functions)在前面的章节中我们已经看到了对class的不同成员存在3个层次的内部保护:public, protected 和 private。在成员为 protected 和 private的情况下,它们不能够被从所在的class以外的部分引用。然而,这个规则可以通过在一个class中使用关键字friend来绕过,这样我们可以允许一个外部函数获得访问class的protected 和 private 成员的能力。为了实现允许一个外部函数访问class的private 和 protected 成员,我们必须在class内部用关键字friend来声明该外部函数的原型,以指定允许该函数共享class的成员。在下面的例子中我们声明了一个 friend 函数 duplicate: // friend functions #include class CRectangle { int width, height; public: void set_values (int, int); int area (void) {return (width * height);} friend CRectangle duplicate (CRectangle); }; void CRectangle::set_values (int a, int b) { width = a

C++学习第十五步:类(Classes)

发表时间:2010-03-06 01:56:08 文章分类:C/C++ 阅读:124019
类(class)是一种将数据和函数组织在同一个结构里的逻辑方法。定义类的关键字为class ,其功能与C语言中的struct类似,不同之处是class可以包含函数,而不像struct只能包含数据元素。类定义的形式是: class class_name { permission_label_1: member1; permission_label_2: member2; ... } object_name; [separator]其中 class_name 是类的名称 (用户自定义的类型) ,而可选项object_name 是一个或几个对象(object)标识。Class的声明体中包含成员members,成员可以是数据或函数定义,同时也可以包括允许范围标志 permission labels,范围标志可以是以下三个关键字中任意一个:private:, public: 或 protected:。它们分别代表以下含义:private :class的private成员,只有同一个class的其他成员或该class的“friend” class可以访问这些成员。protected :class的protected成员,只有同一个class的其他成员,或该class的“friend” class,或该class的子类(derived classes) 可以访问这些成员。public :class的public成员,任何可以看到这个class的地方都可以访问这些成员。如果我们在定义一个class成员的时候没有声明其允许范围,

C++学习第十四步:自定义数据类型 (User defined data types)

发表时间:2010-03-06 01:54:16 文章分类:C/C++ 阅读:79394
前面我们已经看到过一种用户(程序员)定义的数据类型:结构。除此之外,还有一些其它类型的用户自定义数据类型:[separator]定义自己的数据类型 (typedef)C++ 允许我们在现有数据类型的基础上定义我们自己的数据类型。我们将用关键字typedef来实现这种定义,它的形式是:typedef existing_type new_type_name;这里 existing_type 是C++ 基本数据类型或其它已经被定义了的数据类型,new_type_name 是我们将要定义的新数据类型的名称。例如:typedef char C;typedef unsigned int WORD;typedef char * string_t;typedef char field [50];在上面的例子中,我们定义了四种新的数据类型: C, WORD, string_t 和 field ,它们分别代替 char, unsigned int, char* 和 char[50] 。这样,我们就可以安全的使用以下代码:C achar, anotherchar, *ptchar1;WORD myword;string_t ptchar2;field name;如果在一个程序中我们反复使用一种数据类型,而在以后的版本中我们有可能改变该数据类型的情况下,typedef 就很有用了。或者如果一种数据类型的名称太长,你想用一个比较短的名字来代替,也可以是用typedef。联合(Union)联合(Union) 使得同一段内存可以被按照不同的数据类型来访问,数据实际是存储在同一个位置的。它的声明和使用看起来与结构(structure)十分

C++学习第十三步:数据结构 (Data Structures)

发表时间:2010-03-06 01:50:44 文章分类:C/C++ 阅读:59647
一个数据结构是组合到同一定义下的一组不同类型的数据,各个数据类型的长度可能不同。它的形式是:struct model_name {type1 element1;type2 element2;type3 element3;..} object_name;[separator]这里model_name 是一个这个结构类型的模块名称。object_name 为可选参数,是一个或多个具体结构对象的标识。在花括号{ }内是组成这一结构的各个元素的类型和子标识。如果结构的定义包括参数model_name (可选),该参数即成为一个与该结构等价的有效的类型名称。例如:struct products {char name [30];float price;};products apple;products orange, melon;我们首先定义了结构模块products,它包含两个域:name 和 price,每一个域是不同的数据类型。然后我们用这个结构类型的名称 (products) 来声明了 3个该类型的对象:apple, orange 和melon。一旦被定义,products就成为一个新的有效数据类型名称,可以像其他基本数据类型,如int, char或 short 一样,被用来声明该数据类型的对象(object)变量。在结构定义的结尾可以加可选项object_name ,它的作用是直接声明该结构类型的对象。例如,我们也可以这样声明结构对象apple, orange和melon:struct products {char name [30];float price;}app

C++学习第十二步:动态内存分配 (Dynamic memory)

发表时间:2010-03-05 08:54:52 文章分类:C/C++ 阅读:131574
到目前为止,我们的程序中我们只用了声明变量、数组和其他对象(objects)所必需的内存空间,这些内存空间的大小都在程序执行之前就已经确定了。但如果我们需要内存大小为一个变量,其数值只有在程序运行时 (runtime)才能确定,例如有些情况下我们需要根据用户输入来决定必需的内存空间,那么我们该怎么办呢?答案是动态内存分配(dynamic memory),为此C++ 集成了操作符new 和delete。  操作符 new 和 delete 是C++执行指令。本节后面将会介绍这些操作符在C中的等价命令。[separator]操作符new 和new[ ]操作符new的存在是为了要求动态内存。new 后面跟一个数据类型,并跟一对可选的方括号[ ]里面为要求的元素数。它返回一个指向内存块开始位置的指针。其形式为:pointer = new type或者pointer = new type [elements]第一个表达式用来给一个单元素的数据类型分配内存。第二个表达式用来给一个数组分配内存。例如:int * bobby;bobby = new int [5];在这个例子里,操作系统分配了可存储5个整型int元素的内存空间,返回指向这块空间开始位置的指针并将它赋给b

C++学习第十一步:

发表时间:2010-03-05 08:53:53 文章分类:C/C++ 阅读:112433
暂无文章介绍
12下一页