C++学习笔记
- 格式:doc
- 大小:164.50 KB
- 文档页数:10
C++学习笔记 2015.1.5之前的内容复习,来自C++Primer Plus 1、什么是面向对象的编程? 简单来说,就是编程时不用考虑繁琐的格式。就好像程序有自动识别的功能,能针对不同的数据类型自动使用不同的处理方法。而且这些编程语句的编写是很简单的。编程者不需要理解这些操作的底层实现,因为这些操作的底层实现是很繁琐的,而且没必要知道的。编程者只需要正确使用这些操作,它们既简单又高效。 C++既有面向对象的特性,又有面向结构的特性,C++像是一个桥梁。向下,可以用面向过程的方法和思想编写程序。中间,能用过程化的程序实现面向对象的功能。向上,可以直接使用封装好的函数,完全实现了面向对象的编程。 2、C++中哪些特性体现了面向对象编程?
2.1 类的概念: C++中扩展了C中结构体的概念,并形成了“类”的概念。类和结构体类似,能从不同维度描述同一个事物。例如,若将每个学生个体看做一个事物,则可以从身高、体重、相貌方面描述他。类就提供了这样一种描述方法。在这个例子中,学生个体就被称为“对象”,描述学生的角度就被称为“成员”。 但是,与C语言不同,C++不但提供了数据的表示方法,还规定了数据的处理方法,这就是成员函数的概念。C语言中,复杂的数据可以用结构体表示,但是对复杂数据的处理仍然很不方便。C语言中若想对结构体进行操作,只能单独地对结构体的某个成员进行操作。这样就非常不方便。C++中,由于定义了成员函数,程序员可以很轻松地对整个对象进行操作、对对象的多个成员进行操作或者对成员的单个成员进行操作。这样,C++类的作用就凸显了:编程人员可以更方便地处理复杂数据。另外,在使用程序时,编程人员可以不用理会程序的底层实现,而只要知道这个成员函数该如何使用就可以了。 2.2 成员函数 成员函数是在成员的类中定义的。公有的成员函数可以在其他函数中被调用,私有函数只能在类的内部被使用。成员函数最根本的特性是需要被类对象调用。成员函数看似没有形参,但实际上,类对象就是一个形参。通过这个调用过程,对象的各个值被传递到函数中。 2.3 友函数 友函数可以对私有的类成员进行操作,并且不需要由成员调用。友元函数的一大特点是,由于不需要成员函数调用,成员必须作为参数输入到函数中。例如,在具体的成员函数中,函数的一个参数就是调用函数的对象本身。但是,在友函数中,操作对象一定要闲式地被作为参数,列在友函数的形参中。 2.4 虚函数 虚函数是C++面向对象编程的一个重要特性。这个特性,可以使编程人员不必拘泥于数据格式的细节。虚函数的作用是,用相同的函数名,针对不同的类,调用不同的操作。编程人员不需要关注对象的类型,只需要调用虚函数,编译器会根据对象的类型,自动“解读”数据的类型并进行相应的操作。 2.5 操作符重载 操作符的重载与虚函数是类似的。对已有的操作符,在类中定义一种新的含义。当相应类型的对象调用这个操作时,操作符会根据对象不同,而实现不同的功能。
2015.1.12 内容很多来自网络的各类博客(cnblogs)。这些内容比书上解释的通俗易懂,是很好的资料来源 2.6 类的继承 2.6.1 成员类型:私有、公有和保护 私有成员是这个类所特有的,只有通过这个类定义的函数才能访问。即便是派生类也不能直接访问基类的私有成员,即私有成员不能被继承 保护成员:介于私有和公有之间。私有是说,他不可通过非成员函数访问。公有是说,它可以被继承。也就是说,保护成员只能被本类的函数或派生类的函数访问。 公有成员:可以在任何地方,用任何函数访问 2.6.2 继承类型
继承的声明形式:class 派生类名:访问控制 基类1,访问控制 基类2,„„ 共有继承:比较简单,就是在基类的基础上再做补充。声明方式为:class Aa:public A。Aa类就是A的公有继承。Aa可以通过调用A中的函数对A私有成员进行操作。 私有继承:基类的公有成员和保护成员全部继承为派生类的私有成员。 保护继承:基类的公有成员和保护成员全部继承为派生类的保护成员。 单继承还是多继承:单继承就是由一个基类产生一个派生类。多继承可能是一个基类产生多个派生类,也可能是一个派生类继承了多个基类。 虚基类: 2.7在类的声明中使用另一个类 2.8 析构、储存空间
2.9 模板(体现C++代码重用的思想) C++中模板的存在是为了针对不同的类实现不同的功能。例如:编写了一个swap(a,b)函数,用来交换整数int a和int b的值。但是,如果我想这个函数如果也能交换double类型的a和b就好了。于是我在函数后面再加一个参数,用于表示这个函数该操作什么类型的数据。比如:swap(a,b),表明这个函数用来交换int类型的数据。Swap(a,b)用来交换double类型的数据。 这个功能是:对有一定相似性的类,提供了简便的操作方法。以刚才的swap函数为例,无论是交换int类,还是交换double类,其功能就是交换,这就是其内在的相似性。这种内在的相似性决定了可以死使用这种模板功能,实现代码重用。 C++中的两种模板:类模板和函数模板。 类模板:声明格式:Templateclass Example 调用格式:Example xmpl 分析:这种模板的基础是类结构上的相似性。比如,类声明了不同大小的堆栈, 比如20个长度的堆栈和40个长度的堆栈。尽管长度不同,但都是堆栈, 这就是类结构上的相似性。这种情况下就比较适合用类模板。 函数模板:声明格式:Template void Example(x1,x2,.....) 调用格式:Example(x1,x2....) 分析:这种模板的使用基础是操作上的相似性。比如刚才的swap函数的例 子,不管是int类还是double类,都是需要交换的,这就是操作上的 相似性。这种操作上的相似性就是使用类模板的基础。 2.2.10异常 C++中可能出现两类错误。一类是语法错误,这类错误 可以通过编译器的检查检测出。另一类错误是算法上的错误,算法上的错误不会引起编译器告警,但是可能使运行结果出错,进而导致数组下标溢出,系统内存不足等情况。比如,func函数返回两个数的商,如果除数是0,那么运行就会出错。C++提供了一些工具,让我们能检测并处理第二类错误。 C++提供了三个函数处理这类错误:try函数,throw函数和catch函数。 首先是throw函数,这个函数用来抛出一个异常的变量。比如变量y异常,那么throw y就将表达式y抛出。 Try和catch要配合使用。其关系类似于do„„while。Try{。。。},catch(数据类型){}。如果try的大括号内执行了throw语句,则接下来会跳转到catch函数中,catch的作用是根据数据类型判断抛出的数据。Catch内的函数体是用来处理异常的。 比如,double类型的变量y不能等于0,如果等于0,会被认为是异常而执行throw语句。那么程序可以这样写: Double y=5; Try { If (y==0) Throw y; } Catch (double) { Cout<<”error”; } 函数解析:try函数将判断y的值是否正确。若y不等于0,则不执行throw语句,那么也就不会执行后面的catch函数。如果y=0,那就会执行throw语句,抛出一个double类型的变量(也就是y的类型)。然后,程序会自动进入catch函数,处理这个异常。
2016.1.13 3、在C++中读取和输出文件 C++对文件操作的函数包含在fstream.h文件中。下面写几个简单的典型函数: #include Void main() { Ofstream SaveFile(“cpp-hone.txt”); //SaveFile的作用是,如果没有文件,则建立, 若没有,则打开一个文件。 SaveFile<<”I Live C++”; //像cout一样,可以直接输出 SaveFile.close(); } Void main() { Ifstream OpenFile(“cpp-home.txt”); Char ch; While(!Openfile.eof()) //若没读到文件末尾,则OpenFile.eof()返回0 { OpenFile.get(ch); //将txt文本的字符读入到ch变量中 Cout<} } 问题:C++程序怎样知道文件的位置?
4、C++中的标准模板库 标准模板库就是C++自带的、可以直接使用的模板。在编程时直接调用这些模板,可以实现对不同的类成员进行操作。比如,vector模板可以储存类的对象,并对这些对象进行排序、比较等操作。 4.1Vector模板类 Vector模板类是个容器,里面能储存任意个数的对象,但一个容器中的所有对象必须类型相同。Vector容器中的类是连续储存的。 Vector的连续储存特性和数组的连续储存特性是相似的。不同之处在于,数组的连续储存是静态的,一旦开辟就无法扩充。Vector的连续储存是动态的,当Vector需要扩容时,系统会自动寻找一片新的连续空间,然后将旧的内容全部复制过去,再把旧的储存空间销毁。 4.1.1 Vector模板类的典型用法 Vectorv1; //建立一个容器v1,容器中储存string类的对象 Vectorv2(10); //建立一个有10个对象的容器v2,对象是string类 Vectorv3(5,”hello”); //建立一个5对象的string容器v3,对象的值为hello Vectorv4(v3.begin(),v3.end()); //复制容器v3,新的容器是v4,与v3完全 相同
C++的深层理解和C++的语言思想 1、静态多态和动态多态
2016.1.16 由学生信息管理系统想到的大型C++程序设计原则: 1、对大型程序来说,软件的架构设计、逻辑设计、程序框图是非常重要的。这些问题不能等到编程的时候解决,一定要先解决这些问题再开始编程。 2、以学生信息管理系统为例,在添加学生对象的时候,要知道之前已经有多少个对象,这需要由别的函数来实现。这个问题就是在编写程序的过程中在知道的,所以添加起来就很混乱。正确的做法是在软件需求分析的时候就把这些关系分析清楚。 3、为什么说尽量少用外部变量?C++中也像C语言中一样可以定义外部变量吗?如果没有,C++中的变量是怎样跨函数进行传递的呢?
C++中的容器