FP(Further Programming)
文章平均质量分 75
Jacy_CSer
南京大学计算机科学与技术系
展开
-
FP-24 事件(消息)驱动的程序设计
Lecture 24 事件(消息)驱动的程序设计Windows简介Windows是一种基于图形界面的多任务操作系统。系统中可以同时运行多个应用程序。每个应用程序通过各自的“窗口”与用户进行交互。用户通过鼠标的单击/双击/拖放、菜单选择以及键盘输入来与程序进行交互。Windows的功能以两种方式提供:工具(应用程序):资源管理器、记事本、画图、…,供用户(人)使用。函数库:作为Windows的应用程序接口(API),以C语言函数形式提供(在windows.h等头文件中申原创 2021-06-10 14:30:59 · 307 阅读 · 0 评论 -
FP-23 异常处理
Lecture 23 异常处理异常概述程序的错误通常包括:语法错误:指程序的书写不符合语言的语法规则。例如:使用了未定义或未声明的标识符左右括号不匹配…这类错误可由编译程序发现。逻辑错误(或语义错误):指程序设计不当造成程序没有完成预期的功能。例如:把两个数相加写成了相乘排序功能未能正确排序…这类错误可通过对程序进行静态分析和动态测试发现。运行异常:指程序设计对程序运行环境考虑不周而造成的程序运行错误。例如:对于“x/y”操作,给y输入了原创 2021-06-10 09:19:35 · 286 阅读 · 0 评论 -
FP-22 输入/输出(面向对象途径)
Lecture 22 输入/输出(面向对象途径)输入/输出(I/O)概述输入/输出(简称I/O)是程序的一个重要组成部分:程序运行所需要的数据往往要从外设(如:键盘、文件等)得到程序的运行结果通常也要输出到外设(如:显示器、打印机、文件等)中去。在C++中,输入/输出操作不是语言定义的成分,而是由具体的实现作为标准库的功能来提供。在C++中,输入/输出是一种基于字节流的操作:在进行输入操作时,可把输入的数据看成逐个字节地从外设流入到计算机内存。在进行输出操作时,则把输出的原创 2021-05-27 10:50:08 · 569 阅读 · 0 评论 -
FP-21 函数式程序设计
Lecture 21 函数式程序设计命令式程序设计范式(imperative programming)过程式与面向对象程序设计属于命令式程序设计范式(imperative programming)需要对“如何做”进行详细描述,包括操作步骤和状态变化。它们与冯诺依曼体系结构一致,是使用较广泛的程序设计范式,适合于解决大部分的实际应用问题。声明式程序设计范式(declarative programming)除了命令式程序设计范式外,还有一类是声明式程序设计范式(declarative p原创 2021-05-27 10:45:08 · 268 阅读 · 0 评论 -
FP-20 基于STL的编程
Lecture 20 基于STL的编程什么是STL?除了从C标准库保留下来的一些功能外,C++还提供了一个基于模板实现的标准模板库(Standard Template Library,简称STL)。STL基于模板实现了一些面向序列数据的表示及常用的操作。STL支持了一种抽象的编程模式。隐藏了一些低级的程序元素,如数组、链表、循环等。STL包含什么?容器类模板容器用于存储序列化的数据,如:向量、队列、栈、集合等。算法(函数)模板算法用于对容器中的数据元素进行一些常用操作,原创 2021-05-27 10:42:04 · 342 阅读 · 0 评论 -
FP-19 泛型(类属)程序设计
Lecture 19 泛型(类属)程序设计面临的问题在程序设计中,经常需要用到一些功能完全相同的程序实体,但它们所涉及的数据的类型不同。例如,对不同元素类型的数组进行排序的函数:void int_sort(int x[],int num);void double_sort(double x[],int num);void A_sort(A x[],int num);这三个函数的实现是一样的(如都采用快速排序算法)。再例如,元素类型不同的栈类:class IntStack{ int原创 2021-05-27 10:36:10 · 366 阅读 · 0 评论 -
FP-18 聚合/组合
Lecture 18 聚合/组合继承不是类代码复用的唯一方式在面向对象程序设计中,有些代码复用不宜用继承来实现:继承除了支持代码复用外,还体现了类之间在概念上的一般与特殊关系(is-a-kind-of)。如果两个类之间没有这个关系,纯粹是为了代码复用而用继承把它们关联起来,这样会造成概念上的混乱。例如:“飞机”类复用“发动机”类的功能就不宜用继承来实现。类之间的整体与部分关系类之间除了继承关系外,还存在一种整体与部分的关系(is-a-part-of),即一个类的对象包含了另一个类的对原创 2021-05-27 10:32:48 · 230 阅读 · 0 评论 -
FP-17 多继承
Lecture 17 多继承多继承的需要性对于下面的两个类A和B:class A{ int m; public: void fa();};class B{ int n; public: void fb();};如何定义一个类C,它包含A和B的所有成员,另外还拥有新的数据成员r和成员函数fc?用单继承实现:class C: public A{ int n,r; //把B类中的n复制过来 public: void fb(); //把B类中的fb复制过来 vo原创 2021-05-27 10:30:08 · 147 阅读 · 0 评论 -
FP-16 抽象类
Lecture 16 抽象类纯虚函数纯虚函数是没给出实现的虚函数,函数体用“=0”表示, 例如:class A{ ...... public: virtual int f()=0; //纯虚函数 ......};纯虚函数需要在派生类中给出实现。抽象类包含纯虚函数的类称为抽象类。抽象类不能用于创建对象。 例如:class A //抽象类{ ...... public: virtual int f()=0; //纯虚函数 ......};......A a; //原创 2021-05-27 10:27:39 · 270 阅读 · 1 评论 -
FP-15 消息的动态绑定
Lecture 15 消息的动态绑定消息的多态性消息的多态性体现为:相同的一条消息可以发送到不同类的对象,从而会得到不同的解释。对于具有public继承关系的两个类,一条可以发送到基类对象的消息,也可以发送到派生类对象,如果在基类和派生类中都给出了对这条消息的处理,那么这条消息就存在多态性。由于基类的指针或引用可以指向或引用基类对象,也可以指向或引用派生类对象:当通过基类的指针或引用向它指向或引用的对象发送消息时,就存在对消息(成员函数调用)的绑定问题。C++默认采用的是静态的消息绑定:原创 2021-04-19 19:10:26 · 127 阅读 · 0 评论 -
FP-14 继承——派生类
Lecture 14 继承——派生类继承的基本概念在开发一个新软件时,把现有软件或软件的一部分拿过来用称为软件复用。目前,不加修改地直接复用已有软件比较困难。已有软件的功能与新软件所需要的功能总是有差别的。解决这个差别有下面的途径:修改已有软件的源代码,它的缺点是:需读懂源代码,可靠性差、易出错,有时源代码难以获得继承机制(Inheritance):在定义一个新的类时,先把已有的一个或多个类的功能全部包含进来,然后在新的类中再给出新功能的定义或对已有类的某些功能重新定义。不需要原创 2021-04-19 19:08:02 · 238 阅读 · 0 评论 -
FP-13 λ表达式
Lecture 13 λ表达式问题的提出对于下面求定积分的函数:double integrate(double (*f)(double), double a, double b);如果要求函数x^2在区间[0,1]的定积分,则一般要先定义一个函数square:double square(double x) { return x*x; }然后再把它作为参数去调用integrate:integrate(square,0,1);如果还要再求函数x^3 、…等一些在程序中很少使用的简单函数的定原创 2021-04-08 09:27:17 · 121 阅读 · 0 评论 -
FP-12 类成员指针
Lecture 12 类成员指针操作符.*和->*a.*pa是一个对象(或结构)p是一个指针,它指向a所属类的某个成员含义:访问a的由p指向的成员pa->*ppa是一个指向对象(或结构)的指针p是一个指针,它指向*pa所属类的某个成员含义:访问pa所指向的对象的由p指向的成员p的类型如何定义?类成员指针class A{ public: int x; void f();};int *p_x = &A::x; //Erro原创 2021-04-08 09:26:01 · 166 阅读 · 0 评论 -
FP-11 C++特殊操作符的重载
Lecture 11 C++特殊操作符的重载C++特殊操作符赋值操作符=访问数组元素操作符[]动态对象创建与撤销操作符new与delete函数调用操作符()类成员访问操作符->类型转换操作符赋值操作符“=”的重载同一个类的两个对象如何赋值?A a,b;......a = b; C++编译程序会为每个类定义一个隐式的赋值操作,其行为是:逐个成员进行赋值操作。对于普通成员,它采用常规的赋值操作。对于成员对象,则调用该成员对象类的赋值操作进行成员原创 2021-04-08 08:47:23 · 194 阅读 · 0 评论 -
FP-10 操作符重载
Lecture 10 操作符重载操作符重载的需要性C++语言本身没有提供复数类型,可通过定义一个类来实现:class Complex //复数类定义{public: Complex(double r=0.0,double i=0.0) { real=r; imag=i; } void display() const { cout << real << '+' << imag << 'i'; } ...... p原创 2021-04-07 08:18:22 · 187 阅读 · 0 评论 -
FP-09 类作为模块
Lecture 09 类作为模块什么是模块?模块是指:从物理上对程序中定义的实体进行分组,是可以单独编写和编译的程序单位。模块是组织和管理大型程序的一个重要手段。一个模块包含接口和实现两部分:接口:是指在模块中定义的、可以被其它模块使用的一些程序实体的描述。实现:是指在模块中定义的所有程序实体的具体实现描述。对于C语言程序中的模块:接口:包含被外界使用的类型定义、常量定义以及全局变量和函数的声明。(.h文件)实现:包含本模块中所有的类型、常量、全局变量和函数的定义。(.c文件)原创 2021-04-07 08:13:13 · 176 阅读 · 0 评论 -
FP-08 友元
Lecture 08 友元根据数据封装的要求,类中定义的数据成员不能在外界直接访问,必须要通过类中定义的public成员函数来访问。在有些情况下,这种对数据的访问方式效率不高!为了提高在类的外部对类的数据成员的访问效率,在C++中,可以指定某些与一个类密切相关的、又不适合作为该类成员的程序实体直接访问该类的非public成员,这些程序实体称为该类的友元。友元是数据保护和数据访问效率之间的一种折衷方案。友元需要在类中用friend显式指出,它们可以是全局函数、其它的类或其它类的某些成员函原创 2021-04-07 08:11:24 · 232 阅读 · 0 评论 -
FP-07 常成员函数、静态成员
Lecture 07 常成员函数、静态成员获取 vs. 改变 对象的状态在程序运行的不同时刻,一个对象可能会处于不同的状态(由对象的数据成员的值来体现)。可以把类中的成员函数分成两类:获取对象状态(不改变数据成员的值)改变对象状态(改变数据成员的值)例如:class Date{ public: void set(int y, int m, int d); //改变对象状态 int get_day(); //获取对象状态 int get_month(); //获取对象状态 in原创 2021-04-07 08:09:03 · 160 阅读 · 0 评论 -
FP-06 拷贝构造函数
Lecture 06 拷贝构造函数若一个构造函数的参数类型为本类的引用,则称它为拷贝构造函数。例如:class A{ ...... public: A(); //默认构造函数 A(const A& a); //拷贝构造函数}; 在创建一个对象时,若用另一个同类型的对象对其初始化,将会调用对象类中的拷贝构造函数。在三种情况下,会调用类的拷贝构造函数:创建对象时显式指出。例如:A a1; A a2(a1); //创建对象a2,用对象a1初始化对象a2把对象作原创 2021-04-07 08:06:42 · 160 阅读 · 0 评论 -
FP-05 构造函数与析构函数
Lecture 05 构造函数与析构函数对象的初始化–构造函数当一个对象被创建时,它将获得一块存储空间,该存储空间用于存储对象的数据成员。在使用对象前,需要对对象存储空间中的数据成员进行初始化。C++提供了一种对象初始化的机制:构造函数它是类的特殊成员函数,名字与类名相同、无返回值类型。创建对象时,构造函数会被自动调用。例如:class A{ int x,y; public: A() { x = 0; y = 0; } //构造函数 ......};......A a; /原创 2021-04-07 08:04:52 · 147 阅读 · 0 评论 -
FP-04 “this”指针
Lecture 04 “this”指针类的每一个成员函数(静态成员函数除外)都有一个隐藏的形参this,其类型为该类对象的指针;在成员函数中对类成员的访问是通过this来进行的。例如,对于前面A类的成员函数g:void g(int i) { x = i; }编译程序将会把它编译成:void g(A *const this, int i) { this->x = i; }; 当通过对象访问类的成员函数时,将会把相应对象的地址传给成员函数的this参数。例如,对于下面的成原创 2021-04-07 08:01:53 · 119 阅读 · 0 评论 -
FP-03 对象与类
Lecture 03 对象与类类对象构成了面向对象程序的基本计算单位,而对象的特征则由相应的类来描述。对象是用类来创建的,因此,程序中首先要定义类。C++的类是一种用户自定义类型,定义形式如下:class <类名> { <成员描述> } ;成员包括:数据成员和成员函数。类成员标识符的作用域为整个类定义范围。数据成员数据成员是对类的对象所包含的数据描述,它们可以是常量和变量,类型可以是任意的C++类型(void除外) 。数据成员的描述格式与C的结构成员的描述格原创 2021-04-07 07:59:53 · 274 阅读 · 0 评论 -
FP-02 面向对象程序设计概述
Lecture 02 面向对象程序设计概述什么是面向对象程序设计(Object-oriented Programming)面向对象程序设计具有以下几个特征:程序由若干对象组成,每个对象是由一些数据以及对这些数据所能实施的操作所构成的封装体;对象的特征(包含那些数据与操作)由相应的类来描述;对数据的使用是通过向包含数据的对象发送消息(调用对象类的对外接口中的操作)来实现的;一个类所描述的对象特征可以从其它的类继承(获得)。面向对象程序设计的基础是数据抽象与封装。注意:如果没有“继承”,则称原创 2021-04-07 07:56:18 · 198 阅读 · 0 评论 -
FP-01 数据抽象与封装概述
Lecture 01 数据抽象与封装概述抽象与封装抽象与封装是两个重要的程序设计手段,主要是用来驾驭程序的复杂度,便于大型程序的设计、理解与维护。对于一个程序实体而言,抽象是指该程序实体的外部可观察到的行为,不考虑该程序实体的内部是如何实现的。(控制复杂度)封装是指把该程序实体内部的具体实现细节对使用者隐藏起来,只对外提供一个接口。(信息保护)主要的程序抽象与封装机制包括:过程抽象与封装数据抽象与封装过程抽象与封装过程抽象用一个名字来代表一段完成一定功能的程序代码,代码的使用原创 2021-04-07 07:54:42 · 660 阅读 · 0 评论